Работа с изображениями в Laravel через пакет Intervention Image

В Laravel-приложениях часто приходится обрабатывать изображения. Например, уменьшать загружаемые аватары до фиксированного размера, обрезать, конвертировать в другие форматы или добавлять водяные знаки. В этой статье мы посмотрим, как использовать пакет Intervention Image (intervention/image) для таких задач в Laravel.

Что такое Intervention Image

Intervention Image - это open-source библиотека на PHP для создания и редактирования изображений. Она работает поверх библиотек GD или Imagick, предоставляя единый удобный API, благодаря чему можно переключаться между этими библиотеками, не меняя код.

Когда использовать Intervention Image в Laravel

Этот инструмент пригодится, когда нужно:

  • изменить размер изображения (например, превратить аватар в квадрат 250 × 250),

  • обрезать часть изображения,

  • повернуть по ориентации из EXIF-данных,

  • конвертировать изображение (например, из JPG в PNG),

  • добавить водяной знак.

Установка пакета

Для начала убедитесь, что в вашем окружении установлены расширения GD или Imagick. Laravel-интеграция идет через отдельный пакет intervention/image-laravel, который добавляет провайдер и фасад для удобства использования.

Установите его следующей коммандой:

composer require intervention/image-laravel

И опубликуйте конфигурационный файл:

php artisan vendor:publish --provider="Intervention\Image\Laravel\ServiceProvider"

В config/image.php можно выбрать драйвер (GD или Imagick) и задать дополнительные опции, например автоматическую ориентацию или цвет смешивания.

Чтение изображений

Чтобы начать обработку изображения, его нужно прочитать. Простой пример - открытие картинки по пути:

use Illuminate\Support\Facades\Storage;
use Intervention\Image\Laravel\Facades\Image;

$image = Image::read(Storage::path('images/avatar-image.jpg'));

Также можно сначала получить содержимое файла через Storage::get и передать данные в Image::read(). При загрузке файлов в контроллер вы можете сразу читать их из запроса:

Route::post('/avatar', function (Request $request) {
    $image = Image::read($request->file('avatar'));
    // ...
});

Для тяжёлых обработок имеет смысл сохранять исходник и выполнять редактирование в очередях, чтобы не замедлять ответ пользователю.

Чтение метаданных

У объекта изображения есть методы для получения EXIF-данных, размера, ширины и высоты:

$exif = $image->exif();
$width = $image->width();
$height = $image->height();

Текущий пример EXIF-данных может содержать размер файла, MIME-тип, ширину/высоту и другое. Если EXIF отсутствует, метод вернёт null.

Изменение размера

Intervention Image предоставляет несколько способов изменить размеры:

  • resize() задаёт точные размеры,

  • scale() масштабирует с сохранением пропорций,

  • scaleDown() масштабирует так, чтобы не превышать заданные размеры.

Вот примеры:

$image->resize(width: 100, height: 100);
$image->scale(width: 100);
$image->scale(width: 120, height: 100);

После обработки изображение можно сохранить:

$resized->save(Storage::path('images/avatar-image-resized.jpg'));
// Чтобы повернуть изображение на нужный угол:
$rotated = $image->rotate(-90);
$rotated->save(Storage::path('images/avatar-image-rotated.jpg'));
// Обрезка. Например, чтобы вырезать квадрат 2500 × 2500px из центра:
$cropped = $image->crop(width: 2500, height: 2500, position: 'center');
$cropped->save(Storage::path('images/avatar-image-cropped.jpg'));

Можно также объединять операции, например: обрезать → изменить размер → сохранить.

Конвертация форматов

Для изменения формата изображения используются методы вроде toPng(), toWebp(), toJpeg(). Пример:

Image::read($data)->toWebp()->save(Storage::path('images/avatar-image.webp'));

Это удобно, если вам нужна оптимизация размера файлов или поддержка современных форматов.

Водяные знаки

Чтобы добавить водяной знак (например, логотип), можно использовать метод place():

Image::read($source)
    ->crop(width: 2500, height: 2500)
    ->scale(width: 500, height: 500)
    ->place(
        element: Storage::get('images/logo.png'),
        position: 'bottom-right',
        offset_x: 10,
        offset_y: 10,
        opacity: 70
    )
    ->save(Storage::path('images/avatar-watermarked.jpg'));

Здесь логотип вставляется в правый нижний угол с небольшой отступом и заданной прозрачностью.

Подведение итогов

Intervention Image - это мощный и простой инструмент для обработки изображений в Laravel. Он покрывает основные задачи: чтение, изменение размера, обрезка, поворот, конвертация форматов, водяные знаки и работу с метаданными.

Комментарии (0)

Войдите, чтобы оставить комментарий

Похожие статьи

Осваиваем сервис-контейнер Symfony с помощью современных PHP-атрибутов

Объясняем как использовать современные PHP-атрибуты для настройки сервис-контейнера Symfony, чтобы избавиться от сложной YAML-конфигурации и сделать код более компактным и понятным.

27 0 1 мин

Простой способ работать с конкурентностью и параллелизмом в Python

Объяснение, как с помощью стандартных средств Python (concurrent.futures) легко решать задачи конкурентности и параллелизма. Приведены практические примеры использования пулов потоков и процессов.

41 0 2 мин

PHP Generators

Статья рассказывает о PHP генераторах - что это, как они работают, зачем нужны и как использовать их в реальных проектах. Примеры включают чтение больших CSV и потоковую обработку данных.

42 0 2 мин