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);
Предыдущая запись
Yii2: Использование Faker для генерации тестовых данныхСледующая запись
Yii2: Кэширование данных (примеры)
Комментарии (0)