От автора: обработка изображений на серверной стороне довольно важный этап в механизме сохранения последнего для абсолютно любого проекта. Практика показывает, что пользователи в поле загрузки добавляют картинки различных типов, форматов и размеров, что приводит к ошибкам или же к некорректным отображениям в соответствующих блоках сайта. Поэтому в текущем уроке мы рассмотрим обработку и обрезку изображений средствами библиотеки Intervention Image.
Данный урок – это логическое продолжение урока «Обрезка изображений по окружности с последующей загрузкой на сервер», так как в созданном приложении не хватает функционала по обрезке и нормализации загружаемых картинок. Механизм сохранения файлов, который был описан в представленном уроке, работает просто отлично. Но вот что будет, если пользователь попытается загрузить изображение, скажем, в размере 10 000 пикселей по ширине?
Если настройка сервера позволяет загружать большие файлы, то изображение успешно загрузится и выведется в попапе, что, скорее всего из-за больших размеров приведет к появлению полос прокрутки, что не совсем хорошо. А значит после сохранения изображения на сервер, обязательно необходимо выполнить его обрезку до требуемых параметров и только потом продолжать выполнение поставленной задачи.
Как Вы знаете, в стандартном функционале языка PHP есть расширение GD, которое представляет собой «мини-фотошоп» по работе с картинками и позволяет выполнить абсолютно любую манипуляцию с ними. Но проблема заключается в том, что его методы довольно специфичны и не совсем удобны в использовании. Поэтому сегодня мы с Вами задействуем функционал библиотеки Intervention Image, которая очень проста в использовании и изучении.
Как обычно, начинаем с установки требуемой библиотеки. Для этого в консоли, в директории проекта, выполняем команду:
composer intervention/image
Поле этого в корне проекта будет создана директория vendor, вмещающая указанный инструмент и все его зависимости.
Для подключения библиотеки к проекту добавляем следующую строку кода в файле server.php (подключаем сгенерированный композером файл autoload.php’):
require 'vendor/autoload.php';
Также необходимо импортировать пространство имен, в котором описан специальный класс-менеджер по работе с изображениями:
use Intervention\Image\ImageManager;
После этого можно приступать к непосредственной работе над изображениями. А значит, после того как файл был перемещен из временной директории PHP в каталог проекта, мы создадим объект класса ImageManager:
$manager = new ImageManager(array('driver' => 'gd'));
При этом в конструктор указанного класса передаем в качестве аргумента массив с параметрами. Параметр доступен только один – это драйвер обработки изображений. И как Вы видите – это стандартное расширение GD, о котором сегодня я уже вспоминал.
Далее создаем объект для интересующего изображения:
$image = $manager->make($uploadfile);
При этом у ранее созданного объекта менеджера вызывается метод make(), который в качестве первого параметра принимает путь к интересующему изображению. Далее изменяем размеры изображения простым вызовом метода resize():
$image->resize(350, 350);
При этом в качестве аргументов передается ширина и высота будущего изображения в пикселях. Конечно, в этом случае возможны искажения, ведь новое изображение в точности будет соответствовать указанным размерам, и, чтобы это предотвратить, можно третьим аргументом передать анонимную функцию со следующим кодом:
$image->resize(350, 350,, function($img) { $img->aspectRatio(); $img->upsize(); });
Вызов метода aspectRatio(), указывает библиотеке, что обязательно необходимо соблюдать пропорции нового изображения. А метод upsize() предотвращает увеличение изображения, если размеры исходного меньше переданных параметров. После этого можно изображение сохранить:
$image->save($uploadfile, 60);
По аналогии можно повторно создать объект изображения и создать копию с некоторыми заданными размерами. Как Вы видите, на обработку изображения потребовалось буквально несколько строк кода. Удобно, не правда ли?
Помимо метода resize() есть так же несколько методов, которые позволяют менять размеры изображений. Метод crop() – выполняет обрезку изображения, до указанных параметров.
$image = Image::make('test/pic2.jpg')->crop(200, 200,0,0);
Как не трудно догадаться, первый и второй параметр – это ширина и высота нового изображения а также координаты левого верхнего угла, с которого будет реализована обрезка. Результат будет следующим:
Притом, что исходное изображение выглядит вот так:
Согласитесь, что довольно часто изображение приходится не просто обрезать, а комбинировать обрезку с изменением размера. То есть, для начала необходимо изменить размер до максимально допустимого, а потом, при помощи обрезки, подогнать его под определенный формат. Собственно, для этого также есть метод:
$image = Image::make('test/pic2.jpg')->fit(100, 180, function($img) { $img->upsize(); });
При этом результат будет следующим:
Если необходимо изменить размер только по ширине, можно воспользоваться методом widen(), если же по высоте – heighten();
Методы, представленные в текущей статье – это только малая часть тех инструментов, которые доступны в рассматриваемой библиотеке, поэтому если она Вас заинтересовала, переходите на официальный сайт и изучайте документацию – она довольно подробная.
На этом данный урок завершен. Всего Вам доброго и удачного кодирования!