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');
25.07.2014
Все статьи