Сегодня мне надо было реализовать решение для изменения размеров изображения в фоновой обработке. Обычно сначала я беру оригинал, сохраняю его на локальный сервер, помещаю имя файла в очередь (в частности, Amazon SQS) и благодаря отличной поддержке задач artisan в Laravel я могу опрашивать очередь, просто написав:
shell$ php artisan queue:listen
Как быто ни было, мне надо было найти хороший инструмент обработки изображений для PHP. Раньше я использовал Imagine, ImageWorkshop, но мне нужно было простое решение, мы не делаем работы по фильтрации или другой обработке изображений на сервере, просто выполняем эти работы на клиенте и отправляем готовое изображение на сервер. В целом обе прежние библиотеки совершенны, но они как Photoshop. Вы можете делать всё, что угодно, но тяжело, и простой процесс вырезания может быть в них несколько сложнее.
В поисках пакета на Packagist я наткнулся на Intervention. Это полностью протестированный, лёгкий класс для изображений. Он умеет делать не так много вещей, но работает он отлично. И что важнее всего, он поддерживает работу с Laravel и имеет собственный сервис-провайдер и фасад. У него приятный, Laravel-овский синтаксис:
$image = Image::make('path/to/the/image');
Так что он действительно мне понравился, одна из лучших вещей, которой он меня шокировал, это функция PHPgrab()
. Она просто берёт лучшее возможное изображение при заданных ширине и высоте. Это как умное вырезание. Я знаю, я не могу точно выразиться, но этот пример из документации реально поможет вам понять смысл функции PHPgrab()
:
// вырезать наиболее подходяще по соотношению 5:3 (600x360) и изменить размер на 600x360 пикселей
$img->grab(600, 360);
// вырезать наиболее подходяще по соотношению 1:1 (200x200) и изменить размер на 200x200 пикселей
$img->grab(200);
Мы создаём несколько разных размеров одной фотографии для использования в различных целях. Одна из таких целей — миниатюра. Мне надо получить лучший квадрат из изображения, если оно не квадратное, чтобы сделать из него миниатюру. Поэтому PHPgrab()
подойдёт для этого идеально.
$image->grab(50, 50) // получение лучшего квадрата,
->save(\Hash::make( // изменение размера на 50x50,
(new \DateTime)->getTimeStamp() . '.jpg', 90 // сохранение его в jpg
); // и установка качества 90.
Видите, это просто 1 строка кода с приятной последовательностью.
Комментарии (2)
Дядя, а при чем тут intervention Что это вообще за отрывок мимолетной фантазии?
Он забыл добавить в начале :)
// import the Intervention Image Manager Class
use Intervention\Image\ImageManagerStatic as Image;