Рубрика:
Веб /
Веб
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
Кирилл Сухов
Используем ImageMagick в веб-разработке
Работа с готовыми изображениями – достаточно распространенное явление в веб-программировании. Построение обычной веб-галереи требует создания уменьшенных копий картинок, компрессии, конвертации формата, а возможно, и некоторых других операций по их обработке. Идеальное, на мой взгляд, средство для решения подобных задач – графический пакет ImageMagick.
Для подобных действий также широко применяется библиотека GD, имеющая в арсенале своей второй версии , довольно внушительный список функций.
Работать с GD можно посредством PHP, Perl, Tcl и некоторых других языков. Она имеет широкие возможности, но качество результирующих изображений часто оставляет желать лучшего. Кроме того, такие действия, как изменение пропорций, «обрезка» изображения, манипуляции с цветами, вставка другого рисунка, хоть и возможны, но крайне неудобны. Здесь на помощь приходит пакет ImageMagick (http://imagemagick.org), представляющий прекрасное средство для обработки изображений. Работа с ним возможна посредством интерфейсов для различных языков программирования (Perl, Python, PHP, C). Сегодня мы рассмотрим способы и приёмы работы с графикой PHP с использованием пакета ImageMagick.
Что представляет собой ImageMagick?
Коротко поясню, чем является этот пакет и какие задачи можно решить с его помощью. Вообще говоря, я использую не совсем детерминированный термин «пакет», хотя данный продукт называют обычно библиотекой и даже утилитой. На самом деле это согласованный (что немаловажно) набор утилит для работы с графикой, причём в полном соответствии с идеологией каждая из них выполняет свою задачу. Конечно, возможности ImageMagick не могут сравниться с потенциалом графического процессора, но для наших задач это и не нужно. Если вы пользователь *nix-операционной системы, то ImageMagick у вас, скорее всего, уже установлен или по крайней мере присутствует в дистрибутиве. В противном случае забираем его по адресу http://www.imagemagick.org/script/download.php (присутствуют также версии для Windows и MacOS).
Способы применения
Для PHP-разработчика есть два основных пути работы с изображениями с помощью ImageMagic: выполнять команды пакета, пользуясь функцией exec() (или system()), или использовать класс imagick из репозитария PEAR. Большинство программистов применяют именно первый подход. Причины этого очевидны – любая работа с графикой означает довольно существенное потребление ресурсов веб-сервера, а дополнительный интерфейс, как бы хорошо он ни был написан, эту нагрузку отнюдь не уменьшает. Правда, в последнее время появился повод пересмотреть эту точку зрения, но об этом чуть позже. Кроме того, прямой вызов команд пакета даёт доступ ко всем его возможностям.
Конечно, у данного метода есть и недостатки. У скриптов, вернее, у пользователя, от имени которого они запускаются, должны быть соответствующие права, но проблемы безопасной и эффективной работы веб-сервера мы в данный момент не обсуждаем. Основные возможности пакета будем рассматривать, предполагая, что его команды запускаются именно таким образом.
Возможности пакета
Наверное, самая часто используемая утилита ImageMagic – это convert. Её возможности мы продемонстрируем на достаточно типовой задаче конвертации графических файлов из одного формата в другой. Вот как просто проходит эта операция:
// исходный файл
$primary="test.jpg";
// имя нового файла
$secundary ="test2.gif";
exec("convert ". $primary." " test2.gif);
Вот и всё! Под именем test2.gif мы получили копию исходного изображения в новом формате.
Разумеется, продемонстрированная функциональность довольно скромна, но в справке по convert можно найти более 150 (!) опций этой утилиты, ознакомившись с которыми, начинаешь понимать, почему в названии пакета присутствует слово magick.
Скажем, уменьшить вес картинки можно, просто включив одну из опций:
exect("convert ". $primary." -resize 30% ". test.gif);
Не отступая от традиции, для примера работы библиотеки я взял (не очень качественную) фотографию (рис. 1).
Рисунок 1. Исходное фото
Картинка (в формате jpg) занимает 124 Kb. После вышеприведённого преобразования получаем рисунок в формате gif (рис. 2), «весящий» уже 37 Kb.
Рисунок 2. Уменьшаем «вес» фотографии
Конечно, потеря качества есть, но любой человек, работавший до этого с GD, признает результат замечательным. Воспользуемся какой-нибудь ещё возможностью convert, например, изменим цвета оригинала:
exect("convert ". $primary." -coloreze 0, 0, 50 ". test2.gif);
результат на рис. 3.
Рисунок 3. Экспериментируем с цветом
Опции утилиты реализуют огромное количество различных трансформаций изображения – изменение размеров и координат, применение разнообразных фильтров, размытие, наложение тени и многое другое. На полное их описание не хватило бы всего журнала, поэтому лучше кратко опишем возможности остальных утилит.
Утилита mogrify во многом повторяет функциональность convert, но результаты преобразования она сохраняет в исходном файле. Кроме того, данная утилита позволяет работать с группой файлов по маске.
- Montage – позволяет комбинировать изображения, создавать композиции.
- Animate – как видно из названия, используется для анимации, позволяет работать с анимированными gif-файлами.
- Combine – комбинирует изображения (очень удобна для нанесения логотипов на картинки).
- Import – «снимает» изображение заданной области экрана.
- Composite – также позволяет создавать композиции нескольких изображений и изменять форму изображения.
- Identify – возвращает информацию о параметрах изображения.
Утилита conjure стоит несколько особняком, она представляет собой командный процессор для встроенного скриптового языка Magick Scripting Language (MSL).
Основная при ручной работе утилита display является «обвёрткой» для остальных функций преобразования графики, нам в данном случае бесполезна.
Более подробную информацию по использованию утилит пакета можно увидеть на официальном веб-сайте ImageMagic (http://www.imagemagick.net/script/command-line-tools.php) или в документации, идущей вместе с дистрибутивом.
Использование модуля Imagick
Недостатки вызова утилит ImageMagick как внешних программ становятся очевидны, когда операции по манипуляциям с изображениями являются обычной функциональностью приложения. Банальный пример – публичная веб-галерея со средними возможностями. Как уже говорилось выше, класс для работы с пакетом присутствует (вернее, присутствовал) в репозитарии PEAR. Относительно недавно на его основе был создан PECL-модуль imagick, доступный в настоящее время по адресу: http://pecl.php.net/package/imagick (присутствует и версия под Windows, в виде скомпилированной dll, скачать её можно здесь: http://snaps.php.net/win32/PECL_4_3). PECL – это репозитарий модулей PHP, не входящих в официальный дистрибутив. Большинство из них находятся в разработке, а самые успешные становятся штатными расширениями (из недавних это модуль SOAP).
Расширение устанавливается как обычный php-модуль, в папку ext/imagick (или, в зависимости от версии PHP, в extensions/imagick), затем в конфигурационном файле php.ini, в секции Dynamic Extensions, прописываются соответствующие строчки:
;для UNIX систем
extension= imagick.so
;для Windows
extension=msql.dll
После перезагрузки веб-сервера, функции imagick становятся доступны.
Предупреждение для программистов, решивших опробовать возможности пакета на операционной системе Windows, – скомпилированная dll будет работать только самой последней версией интерпретатора PHP.
Разумеется, модуль imagick не предоставит доступ ко всем возможностям ImageMagick (по уверению его создателя, пока), но наиболее распространенные действия с графикой в веб-программировании в нём уже реализованы.
К сожалению, на момент написания статьи официальная документация на модуль практически отсутствовала, поэтому я постараюсь осветить работу всех доступных в данное время функций.
Следует также заметить, что расширение в разработке и все его функции имеют статус экспериментальных, в частности это обозначает, что использовать их нужно осторожно (use this function at your own risk). Правда, в моей практике никаких опасных сбоев замечено не было. Работа с расширением происходит так:
<?php
$handle = imagick_create () or die ("Could not create handle")
imagick_read($handle,"myimg.gif");
imagick_set_attribue($handle, array("quality"=>10, "format"=>"jpeg");
imagick_write($handle,"myimg.jpg");
imagick_free($handle);
?>
В первой строчке функцией imagick_create() мы получаем указатель на новый экземпляр imagick, который потом используем во всех дальнейших действиях. Затем с помощью imagick_read() считываем существующее изображение. Формат файла при этом определяется автоматически, если же этого не происходит, разработчики рекомендуют использовать префикс из названия формата, отделённый от имени файла двоеточием (например, GIF:mygif.gif). Данная функция позволяет задавать в качестве второго параметра и URL (например, http://my.server.com/picture.gif). Другой пример использования imagick_read():
<?php
$handle = image_new() or die ("Could not connect");
imagick_read($handle, array("mypic.gif", "http://my.server.com/mypic.png"));
imagick_write($handle, "PNG:mypic.myext");
imagick_free($handle);
?>
В данном случае применяется image_new(), синоним и вероятная замена imagick_create ().
Функция imagick_set_attribue() изменяет атрибуты рисунка, получая в качестве второго параметра их массив. В настоящее время доступны следующие атрибуты:
Пояснять их значение, я думаю, нет необходимости. Получить атрибуты существующего изображения можно функцией imagick_set_attribute(), принимающей в качестве параметров указатель и имя атрибута. Сейчас доступны следующие значения:
Конечно, список не впечатляет, но всё, что здесь написано, касается версии модуля 0.1, а он активно разрабатывается.
Imagick_write() осуществляет запись результата в указанный файл локальной файловой системы, при этом формат файла определяется по заданному расширению. В случае нераспознавания формата рекомендации такие же, как и для функции imagick_read().
Наконец imagick_free(), как нетрудно догадаться из названия, освобождает указатель и все связанные с ним ресурсы.
Что осталось за рамками нашего небольшого примера? Прежде всего группа функций для преобразования изображений:
- imagick_copy_shear() – усекает изображение до заданных размеров;
- imagick_copy_ crop() – также усекает, но с возможностью задания начальных координат;
- imagick_copy_rotate() – поворачивает изображение вокруг своей оси на заданный угол;
- imagick_copy_sample() – масштабирует изображение.
Все эти функции возвращают указатель на новый ресурс, оставляя исходный (являющийся входным параметром) неизменным.
Функция imagick_copy_resize(), также возвращающая указатель на новый ресурс, позволяет задать размеры изображения, применить к нему фильтр, а также контрастность/размытие (в зависимости от знака входного параметра). На данный момент доступны следующие фильтры:
IMAGICK_FILTER_UNDEFINED
|
IMAGICK_FILTER_POINT
|
IMAGICK_FILTER_BOX
|
IMAGICK_FILTER_TRIANGLE
|
IMAGICK_FILTER_HERMITE
|
IMAGICK_FILTER_HANNING
|
IMAGICK_FILTER_HAMMING
|
IMAGICK_FILTER_BLACKMAN
|
IMAGICK_FILTER_GAUSSIAN
|
IMAGICK_FILTER_QUADRATIC
|
IMAGICK_FILTER_CUBIC
|
IMAGICK_FILTER_CATROM
|
IMAGICK_FILTER_MITCHELL
|
IMAGICK_FILTER_LANCZOS
|
IMAGICK_FILTER_BESSEL
|
IMAGICK_FILTER_SINC
|
Imagick_convert() преобразует один файл в другой или (когда конечный файл не указан) выводит его в браузер. Её упрощённый вариант imagick_dump(), выводит картинку на экран.
Imagick_annotate() добавляет к изображению текст, принимая в качестве второго параметра массив его атрибутов. Пример работы этой функции:
imagick_annotate($handle,array(
"primitive"=>"text 150,150
hello world",
"pointsize"=>60,
"antialias"=>1,
"stroke"=>’green’,
"fill»=>’#ff7755’,
"font»=>"Arial.ttf",
"rotate"=>90
));
Imagick_list-magickinfo() выводит список доступных файловых форматов (в настоящие время таковых более 130, правда, некоторые из них доступны только для чтения).
В заключение хочу заметить, что лидер проекта Imagick, Christian Stocker, в предварительной документации к модулю сетует на нехватку у него свободного времени на доработку и приглашает желающих в ней поучаствовать. Как он утверждает: «It’s really not very hard». Приветствуются также пожелания о том, какие функции следует реализовать в первую очередь. Так что, коллеги, всё в наших руках.
Ссылки:
- Адрес проекта – http://pecl.php.net/package/imagick.
- Examples of ImageMagick Usage – http://www.cit.gu.edu.au/~anthony/graphics/imagick6.
- Graphics from the command line – http://www-106.ibm.com/developerworks/library/l-graf/?ca=dnt-428.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|