В 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);