В 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);
Удалить комментарий?