Yii2: Использование класса yii\imagine\Image (примеры)
В Yii2 есть замечательное расширение yii\imagine\Image
, с помощью которого можно совершать некоторые действия при работе с картинками.
Официальный репозиторий
Документация здесь
Yii Framework Wiki здесь
Рассмотрим наиболее интересные публичные методы класса yii\imagine\Image
:
Метод getImagine()
Возвращает объект Imagine, который поддерживает различные манипуляции с изображениями (например, эффекты)
getImagine(); $img = Yii::getAlias('@webroot/images/img.jpg'); $image = Image::getImagine()->open($img); // Применяем эффекты ...
Метод crop()
Обрезает изображение жёстко по заданным размерам. Пропорциональность не соблюдается (если явно не указать её в размерах), режет с левого верхнего угла.
$image = Yii::getAlias('@webroot/images/img.jpg'); // Обрежет по ширине на 1000px, по высоте на 300px Image::crop($image, 1000, 300) ->save(Yii::getAlias('@webroot/images/img-crop.jpg'), ['quality' => 80]); // Обрежет по ширине на 600px, по высоте на 600px, начиная по оси X с отметки в 100px и по оси Y с отметки в 100px Image::crop($image, 600, 600, [100, 100]) ->save(Yii::getAlias('@webroot/images/img-crop.jpg'), ['quality' => 80]);
Метод resize()
Изменение размера изображения. Если для одного из параметров установлено значение null
, другое вычисляется автоматически на основе соотношения сторон исходного изображения.
Если оба размера установлены, новые размеры вычисляются так, чтобы изображение сохраняло пропорции. Вы можете установить $keepAspectRatio
в false
, если вы хотите принудительно фиксировать ширину и высоту.
$image = Yii::getAlias('@webroot/images/img.jpg'); // Обрежет по ширине на 600px, по высоте пропорционально Image::resize($image, 600, 600) ->save(Yii::getAlias('@webroot/images/img-resize.jpg'), ['quality' => 80]); // Обрежет по ширине на 600px, по высоте пропорционально Image::resize($image, 600, 1000) ->save(Yii::getAlias('@webroot/images/img-resize.jpg'), ['quality' => 80]); // Обрежет по высоте на 400px, по ширине пропорционально Image::resize($image, 1000, 400) ->save(Yii::getAlias('@webroot/images/img-resize.jpg'), ['quality' => 80]); // Обрежет по ширине на 600px, по высоте на 300px, сохранит пропорции ($keepAspectRatio = false) Image::resize($image, 600, 300, false) ->save(Yii::getAlias('@webroot/images/img-resize.jpg'), ['quality' => 80]);
Метод thumbnail()
Создает уменьшенное изображение. Если для одного из миниатюрных размеров установлено значение null
, другое вычисляется автоматически на основе соотношения сторон исходного изображения. Обратите внимание, что расчетный размер эскиза может варьироваться в зависимости от исходного изображения в этом случае.
Если указаны оба размера, итоговая эскиз будет точно указанной ширины и высоты. Как это достигается, зависит от режима.
$image = Yii::getAlias('@webroot/images/img.jpg'); // Обрежет по высоте на 120px, по ширине на 120px Image::thumbnail($image, 120, 120) ->save(Yii::getAlias('@webroot/images/img-thumbnail.jpg'), ['quality' => 80]); // Жёстко обрежет по высоте на 120px, по ширине на 400px Image::thumbnail($image, 400, 120) ->save(Yii::getAlias('@webroot/images/img-thumbnail.jpg'), ['quality' => 80]); // Изменение размера и сохранение пропорций (обрежет по высоте на 400px, по ширине проворционально) Image::getImagine()->open($image) ->thumbnail(new Box(600, 400)) ->save(Yii::getAlias('@webroot/images/img-1.jpg') , ['quality' => 90]);
Метод autorotate()
Автоматически поворачивает изображение на основе информации EXIF. (я так и не понял, как работает данный метод):
$image = Yii::getAlias('@webroot/images/img.jpg'); Image::autorotate($image, 'FF0000')->save(Yii::getAlias('@webroot/images/img-autorotate.jpg'));
Метод frame()
Добавляет рамку вокруг изображения. Размер изображения увеличится на ширину рамки, умноженную на 2 (по цирине картинки и высоте соответственно):
$image = Yii::getAlias('@webroot/images/img.jpg'); // 20 - размер рамки для добавления вокруг изображения // '000' - цвет рамки // 100 - альфа-значение кадра Image::frame($image, 20, '000', 100) ->save(Yii::getAlias('@webroot/images/img-frame.jpg'), ['quality' => 80]);
Метод text()
Рисует текстовую строку на существующем изображении:
$image = Yii::getAlias('@webroot/images/img.jpg'); // Нарисует текст и сохранит (расположение - левый верхний угол) Image::text( $image, 'Draws a text string on an existing image', Yii::getAlias('@webroot/fonts/Arsenal-Regular.otf') )->save(Yii::getAlias('@webroot/images/img-font.jpg'), ['quality' => 80]);
Более сложный пример:
$image = Yii::getAlias('@webroot/images/img.jpg'); $image = Yii::getAlias('@webroot/images/img.jpg'); $text = 'Draws a text string on an existing image'; $fontFile = Yii::getAlias('@webroot/fonts/Arsenal-Regular.otf'); $start = [100, 200]; $fontOptions = [ 'size' => 30, // Размер шрифта 'color' => '000', // цвет шрифта 'angle' => 90 // Угол 90 градусов ]; Image::text( $image, // Картинка, на которой рисуем текст $text, // Текст $fontFile, // Путь к файлу шрифта $start, // Отступ от левого края картинки в 100px, от верхнего в 200px $fontOptions )->save(Yii::getAlias('@webroot/images/img-font.jpg'), ['quality' => 80]);
Метод watermark()
Добавляет водяной знак к существующему изображению:
$image = Yii::getAlias('@webroot/images/img.jpg'); $watermark = Yii::getAlias('@webroot/images/watermark.png'); // 200x200 Image::watermark($image, $watermark) ->save(Yii::getAlias('@webroot/images/img-watermark.jpg'));
Переместим водяной знак в правый нижний угол. Для этого вычислим размер загружаемой картинки, перенесём позиции водяного знака на ширину и высоту загружаемой картинки за минусом ширины и высоты самого водяного знака
$image = Yii::getAlias('@webroot/images/img.jpg'); $watermark = Yii::getAlias('@webroot/images/watermark.png'); // 200x200 $size = getimagesize($image); // Определяем размер картинки $imageWidth = $size[0]; // Ширина картинки $imageHeight = $size[1]; // Высота картинки $watermarkPositionLeft = $imageWidth - 200; // Новая позиция watermark по оси X (горизонтально) $watermarkPositionTop = $imageHeight - 200; // Новая позиция watermark по оси Y (вертикально) Image::watermark($image, $watermark, [$watermarkPositionLeft, $watermarkPositionTop]) ->save(Yii::getAlias('@webroot/images/img-watermark.jpg'));
Эффекты
Можно примерить некоторые эффекты (Больше эффектов https://imagine.readthedocs.io/en/latest/usage/effects.html)
$image = Yii::getAlias('@webroot/images/img.jpg'); // Оттенки серого $image = Image::getImagine()->open($image); $image->effects()->grayscale(); $image->save(Yii::getAlias(Yii::getAlias('@webroot/images/img-effect-grayscale.jpg')), ['quality' => 80]); // Blur (Требуется расширение Imagick или Gmagick php) $image = Image::getImagine()->open($image); $image->effects()->blur(3); $image->save(Yii::getAlias('@webroot/images/img-effect-blur.jpg'), ['quality' => 80]);
Более сложные пример. Изменим размер изображения методом resize()
, применим водяной знак в нижнем правом углу загружаемой картинки:
$image = Yii::getAlias('@webroot/images/img.jpg'); // 1024x768 $watermark = Yii::getAlias('@webroot/images/watermark.png'); // 200x200 $newPath = Yii::getAlias('@webroot/images/img1.jpg'); $img = Image::resize($image, 1024, 300)->save($newPath); $size = getimagesize($newPath); // Определяем размер картинки $imageWidth = $size[0]; // Ширина картинки $imageHeight = $size[1]; // Высота картинки $watermarkPositionLeft = $imageWidth - 200; // Новая позиция watermark по оси X (горизонтально) $watermarkPositionTop = $imageHeight - 200; // Новая позиция watermark по оси Y (вертикально) $img = Image::watermark($img, $watermark, [$watermarkPositionLeft, $watermarkPositionTop]); $img->save(Yii::getAlias('@webroot/images/img-nice.jpg'), ['quality' => 80]); @unlink($newPath);