CMS.Images: обработка изображений
Модуль CMS.Images предназначен для исполнения наиболее часто требуемых задач по обработке изображений: создания тумбов и накладки водяных знаков.
Вообще-то, эти задачи и без всякого модуля не должны вызывать проблем у среднего программиста, однако в этом есть пара неудобств:
- Излишне сложный код (хоть и не чрезмерно, но тем не менее);
- Необходимость выбора между двумя наиболее распространенными механизмами: GD и Imagick. GD есть практически везде, но у Imagick выше качество обработки изображений, поэтому его использование предпочтительнее (там, где он есть).
CMS.Images создан для удобства программиста. Во-первых, он автоматически выбирает какую библиотеку использовать: если есть Imagick, то используется Imagick, в противном случае - GD. Во-вторых, все это делается в едином синтаксисе, который к тому же прост и лаконичен.
Загрузка и сохранение изображений
Core::load('CMS.Images'); // Загрузка $image = CMS_Images::Image('source.jpg'); // Сохранение $image->save('destination.jpg'); // Сохранение в другом формате $image->save('destination.gif','gif'); // Короткий синтаксис "конвейером" CMS_Images::Image('source.jpg')->save('destination.gif','gif');
Создание тумбов
Создание тумбов - наиболее часто возникающая задача. Самый простой случай - изменение размеров с сохранением пропорций:
CMS_Images::Image('source.jpg')->fit(100,100)->save('destination.jpg');
В данном случае мы получим не квадратное изображение 100х100, а пропорциональное исходному, одна из сторон которого (самая длинная) равна 100. Т.е. изменяем размер изображения так, чтобы оно по габаритам вписалось в 100х100.
Если же нужны точно указанные размеры, то вместо fit используем resize. Но при этом о сохранении пропорций можно забыть, изображение окажется сплюснутым по одной из осей:
CMS_Images::Image('source.jpg')->resize(100,100)->save('destination.jpg');
Однако, часто требуется и пропорции сохранить, и четко выдержать размер. Очевидно, в случае пропорций, не совпадающих с указанным размером, это можно сделать только двумя способами: либо обрезать изображение, либо дополнить его полями.
Обрезать можно с помощью метода crop. При этом изображение сначала наиболее точно подгоняется под указанный размер (с сохранением пропорций), после чего выступающие части обрезаются:
CMS_Images::Image('source.jpg')->crop(100,100)->save('destination.jpg');
Если же все части изображения (даже выступающие) нам дороги как память, то можно воспользоваться методом fit_with_margins. Здесь точно также изображение сначала пропорционально подгонится под размер, после чего будут добавлены поля указанного цвета:
CMS_Images::Image('source.jpg')->fit_with_margins(100,100,'#FF12DE')->save('destination.jpg');
Цвет можно указать также и в виде массива RGB:
CMS_Images::Image('source.jpg')->fit_with_margins(100,100,array(100,20,50))->save('destination.jpg');
Перевод в градации серого
Эту задачу также можно отнести к созданию тумбов, т.к. редко где еще требуется серая картинка. Думаю, понятно без пояснений:
CMS_Images::Image('source.jpg')->resize(100,100)->grayscale()->save('destination.jpg');
Наложение водяного знака
Для водяного знака потребуется отдельная картинка в отдельном файле. Самый простой вариант - прозрачный водяной знак в центре изображения:
CMS_Images::Image('source.jpg')->watermark('stamp.jpg')->save('destination.jpg');
Что делать, если требуется поставить водяной знак не в центре, а слева, снизу, в углу? Для этого нужно передать в функцию watermark второй параметр. По умолчанию это - "5". Что это означает? Посмотрите на правую часть обычной клавиатуры - там где цифры совмещены с клавишами управления курсором. Положение водяного знака соответствует положению соответствующей цифры. Т.е. "8" - это верх/центр, "1" - лево/низ, "5" - центр изображения.
// Водяной знак в правом нижнем углу изображения CMS_Images::Image('source.jpg')->watermark('stamp.jpg','3')->save('destination.jpg');
Что делать, если нужны особенные координаты для водяного знака? В этом случае вторым аргументом функции watermark будет ассоциативный массив, в котором переданы параметры, аналогичные применяемым в CSS:
array('left' => '20px','bottom' => '30%');
Прозрачность водяного знака
Для регулирования прозрачности используем параметр opacity, который передаем в массиве (как в предыдущем примере):
CMS_Images::Image('source.jpg')->watermark('stamp.jpg',array('opacity'=>0.8))->save('destination.jpg');
При передаче параметров в массиве мы также можем передать и местоположение водяного знака в "клавиатурном" представлении. Для этого служит параметр mode:
CMS_Images::Image('source.jpg')->watermark( 'stamp.jpg', array('mode'=>'6', 'opacity'=>0.8) )->save('destination.jpg');
Водяной знак в формате PNG
Формат PNG позволяет устанавливать прозрачность в самом изображении. В этом случае установка вручную отличной от единицы прозрачности не допускается. Однако обратите внимание, что по умолчанию такая прозрачность всегда устанавливается равной 0.2. Поэтому если вы хотите использовать водяные знаки в PNG, то обязательно установите прозрачность в единицу.
CMS_Images::Image('source.jpg')->watermark( 'stamp.png', array('mode'=>'5','opacity'=>1) )->save('destination.jpg');