Работа с изображениями в Joomla (JImage)
В Joomla 2.5 появился новый класс для обработки изображений JImage. С помощью этого класса мы можем выполнять различные манипуляции с изображениями, например такие как: изменение размера, наложение различных эффектов и т.д. а так же можно получать информацию об изображении!
Попробуем рассмотреть детально этот класс и методы которые есть в нем!
В качестве исходного изображения буду использовать это:
Для того что бы использовать этот класс и загрузить в него изображение нужно написать следующий код:
$pathToImage = 'images/basic.jpg'; $image = new JImage( $pathToImage );
Изображение можно загрузить и по другому:
$pathToImage = 'images/basic.jpg'; $image = new JImage; $image->loadFile($pathToImage);
Если мы хотим получить ширину или высоту изображения то для этого есть два метода:
$pathToImage = 'images/basic.jpg'; $image = new JImage( $pathToImage ); echo $image->getWidth();//Выводим ширину (выведет 650) echo $image->getHeight();//Выводим высоту (выведет 406)
Что бы получить абсолютный путь по которому лежит изображение необходимо использовать метод getPath() :
$pathToImage = 'images/basic.jpg'; $image = new JImage( $pathToImage ); echo $image->getPath();
Для уменьшения размера изображения существует метод
resize($width, $height, $createNew, $scaleMethod);
В этом функции четыре параметра:
$width - новая ширина изображения
$height - новая высота изображения
$createNew - если этот параметр установить в true то метод вернет нам новый экземпляр класса JImage в котором будут содержаться загруженное изображение со всеми изменениями произведенными ранее
$scaleMethod - метод масштабирования изображения
Пример использования:
$pathToImage = 'images/basic.jpg'; $image = new JImage( $pathToImage ); $image->resize(100, 100, false, JImage::SCALE_INSIDE );
Всего существует три варианта для масштабирования изображения. Ниже приведена таблица с методами масштабирования и результатом работы этих методов:
Масштабирование | Описание | Результат |
---|---|---|
JImage::SCALE_FILL | Жестко подгонит под указанный размер | |
JImage::SCALE_INSIDE (Значение по умолчанию) |
Высота будет уменьшена до указанной, ширина будет пропорционально уменьшена или увеличена | |
JImage::SCALE_OUTSIDE | Ширина будет уменьшена до указанной, высота будет пропорционально уменьшена или увеличена |
Для сохранения изображения после манипуляция с ним JImage существует метод
toFile($path, $type, $options);
$path - путь по которому сохранить файл
$type - тип файла при сохранении. Всего есть три типа для сохранения файлов:
- IMAGETYPE_GIF GIF файл
- IMAGETYPE_PNG PNG файл
- IMAGETYPE_JPEG JPEG файл (этот параметр по умолчанию)
$options - опции! на данный момент там возможно использовать только один параметр $options['quality'] который устанавливает качество изображения для jpg и png файлов!
rotate($angle, $background, $createNew );
Для поворота на определенный угол изображения существует метод
$angle - угол поворота
$background - фон заливки пространтсва которое остается после поворота (по умолчанию заливает белым цветом)
$createNew - если этот параметр установить в true то метод вернет нам новый экземпляр класса
$pathToImage = 'images/basic.jpg'; $image = new JImage( $pathToImage ); //уменьшаем до 200 на 200 точек $imageResizes= $image->resize(200, 200, true); //поворачиваем на 35 градусов и заливаем розовым цветом свободное пространство $imageRotated = $imageResizes->rotate( 35, 0xff00ff, true );
Пример использования:
После выполнения кода выше результатом будет новое изображение:
Для того что бы получить часть изображения существует метод
crop($width, $height, $left, $top, $createNew);
$width - ширина
$height - высота
$left - смещение с левой стороны
$top - смещение с правой стороны
$createNew - если этот параметр установить в true то метод вернет нам новый экземпляр класса
Пример использования:
$pathToImage = 'images/basic.jpg'; $image = new JImage( $pathToImage ); $imageCroped = $image->crop(160, 130, 110, 30, true);
После выполнения кода выше результатом будет новое изображение:
Работа с фильтрами:
Для работы с фильтрами существует функция
filter($type, $options);
$type - тип фильтра
$options - опции фильтра
Почему то мне не удалось подключить фильтры чере jinclude, то есть строка jimport jimport( 'joomla.image.filters' ); не помогла, и постоянно выводилась ошибка о том что не найден фильтр!
По этому пришлось напрямую подключать фильтры через include
Фильтр | Описание | Результат |
---|---|---|
brightness | Увеличивает или уменьшает яркость изображения. Что бы регулировать яркость нужно в опциях передать параметр IMG_FILTER_BRIGHTNESS регулировать контрастность можно как отрицательными так и положительными значениями параметра |
$filterType = 'brightness'; include_once JPATH_BASE . '/libraries/joomla/image/filters/' . $filterType . '.php'; $image = new JImage( $pathToImage ); $imageResized = $image->resize( 200, 200 ); $options = array( IMG_FILTER_BRIGHTNESS => 50 ); $imageResized->filter( $filterType, $options );
Фильтр | Описание | Результат |
---|---|---|
contrast | Увеличивает или уменьшает контрастность изображения. Что бы регулировать контрастность нужно в опциях передать параметр IMG_FILTER_CONTRAST отрицательное значение уменьшает яркость, положительное увеличивает! |
$filterType = 'contrast'; include_once JPATH_BASE . '/libraries/joomla/image/filters/' . $filterType . '.php'; $image = new JImage( $pathToImage ); $imageResized = $image->resize( 200, 200 ); $options = array( IMG_FILTER_CONTRAST => -100 ); $imageResized->filter( $filterType, $options );
Фильтр | Описание | Результат |
---|---|---|
edgedetect | Принцип работы фильтра можно увидеть на изображении. Опций у этого фильтра нет! |
$filterType = 'edgedetect'; include_once JPATH_BASE . '/libraries/joomla/image/filters/' . $filterType . '.php'; $image = new JImage( $pathToImage ); $imageResized = $image->resize( 200, 200 ); $imageResized->filter( $filterType );
Фильтр | Описание | Результат |
---|---|---|
emboss | Принцип работы фильтра можно увидеть на изображении. Опций у этого фильтра нет! |
$filterType = 'emboss'; include_once JPATH_BASE . '/libraries/joomla/image/filters/' . $filterType . '.php'; $image = new JImage( $pathToImage ); $imageResized = $image->resize( 200, 200 ); $imageResized->filter( $filterType );
Фильтр | Описание | Результат |
---|---|---|
grayscale | Оттенки серого. Принцип работы фильтра можно увидеть на изображении. Опций у этого фильтра нет! |
$filterType = 'grayscale'; include_once JPATH_BASE . '/libraries/joomla/image/filters/' . $filterType . '.php'; $image = new JImage( $pathToImage ); $imageResized = $image->resize( 200, 200 ); $imageResized->filter( $filterType );
Фильтр | Описание | Результат |
---|---|---|
negate | Негатив. Принцип работы фильтра можно увидеть на изображении. Опций у этого фильтра нет! |
Пример использования:
$filterType = 'negate'; include_once JPATH_BASE . '/libraries/joomla/image/filters/' . $filterType . '.php'; $image = new JImage( $pathToImage ); $imageResized = $image->resize( 200, 200 ); $imageResized->filter( $filterType );
Фильтр | Описание | Результат |
---|---|---|
sketchy | Негатив. Принцип работы фильтра можно увидеть на изображении. Опций у этого фильтра нет! |
$filterType = 'sketchy'; include_once JPATH_BASE . '/libraries/joomla/image/filters/' . $filterType . '.php'; $image = new JImage( $pathToImage ); $imageResized = $image->resize( 200, 200 ); $imageResized->filter( $filterType );
Фильтр | Описание | Результат |
---|---|---|
smooth | Сглаживание. Принцип работы фильтра можно увидеть на изображении. у фильтра есть опция IMG_FILTER_SMOOTH которая указывает в целочисленном виде силу сглаживания! |
Пример использования:
$filterType = 'smooth'; include_once JPATH_BASE . '/libraries/joomla/image/filters/' . $filterType . '.php'; $image = new JImage( $pathToImage ); $imageResized = $image->resize( 200, 200 ); $options = array( IMG_FILTER_SMOOTH => -100 ); $imageResized->filter( $filterType, $options );
В Joomla 3 появились небольшие изменения.
У класса появилось несколько новых методов для работы с изображениями.
Пример:
$image = new JImage( JPATH_SITE . '/test.jpg' ); $image->cropResize( 200, 300, false ); $image->toFile( JPATH_SITE . '/result.jpg' );
Следующий метод который появился:
createThumbs($thumbSizes, $creationMethod = self::SCALE_INSIDE, $thumbsFolder = null)
Этот метод позволит нам создать группу миниатюр из нашего изображения.
Основные параметры которые принимает этот метод:
- $thumbSizes - массив в котором передаются размеры миниатюр
- $creationMethod - каким методом масштабировать фотографии
- $thumbsFolder - папка в которой будут сохранены миниатюры (по умолчанию это /thumbs)
К дополнению к стандартным вариантам масштабирования: SCALE_FILL, SCALE_INSIDE и SCALE_OUTSIDE в этом методе можно использовать еще два варианта:
CROP - обрежет изображение по указанным размерам
CROP_RESIZE - работает та же как и метод cropResize
Пример работы данного метода:
$image = new JImage( JPATH_SITE . '/test.jpg' ); $thumbs = $image->createThumbs( array( '200x200', '100x100' ), JImage::CROP_RESIZE,JPATH_SITE . '/images/thumbs' );
После выполнения этого кода в папке /images/thumbs у нас появится два изображения:
Метод createThumbs после выполнения вернет массив объектов JImage которыми можно дальше манипулировать как одиночными файлами:
Array ( [0] => JImage Object ( [handle:protected] => Resource id #132 [path:protected] => /thumbs/test_200x200.jpg ) [1] => JImage Object ( [handle:protected] => Resource id #134 [path:protected] => /thumbs/test_100x100.jpg ) )
И последний метод
generateThumbs($thumbSizes, $creationMethod = self::SCALE_INSIDE)
Этот метод работает как и метод createThumbs только не сохраняет сразу миниатюры, а возвращает массив объектов которые мы можем видоизменять как нам захочется с помощью класса JImage!
Принимает этот метод всего два параметра и они совпадают с первыми двумя параметрами которые принимает метод createThumbs
Внимание! При указании размеров миниатюр для методов createThumbs и generateThumbs указывайте их от большего размера к меньшему!
Примечание.
Вся работа с изображениями в Joomla организована на библиотеке GD http://php.net/manual/ru/book.image.php. Так что можно ее свободно применять при необходимости расширения функционала и не париться.