Фотошопим на PHP
Раздел:
Programming /
PHP
@
01.06.2008 |
Ключевые слова: фотошоп php обработка графики ImageMagick MagickWand
Автор: apelsyn
Источник: habrahabr
Для многих задач автоматической обработки фотографий не подходит качество и функционал библиотеки GD. Поскольку возможности обратиться к Photoshop из PHP или Perl пока не существует, решаем проблему с помощью ImageMagick.
Речь пойдет о PHP инрефейсе к ImageMagick MagickWand, который в репозитарии Fedora называется php-magickwand. Хочу обратить Ваше внимание, что MagickWand API отличается от классического ImageMagick тем что позволяет работать как с элементами растровой графики, так и с элементами векторной графики.
Для php есть еще одна реализация интерфейса к ImageMagick, которая называется IMagick, но функционал этой библиотеки, на мой взгляд, уступет MagickWand.
В первой статье рассмотрим на примерах несколько типичных задач по обработке изображений и сравним результаты с php-gd.
Уменьшаем картинку
Уменьшаем изображение вот таким простым кодом
$magick_wand=NewMagickWand();
MagickReadImage($magick_wand,`linux_users.jpg`);
$mgck_local=MagickTransformImage($magick_wand, NULL,`x100`);
MagickStripImage($mgck_local);
MagickEchoImageBlob($mgck_local);
`x100` означает по вертикали 100, по горизонтали сколько получиться, второй параметр отвечает за функции обрезки изображения мы их в нашем примере не используем. MagickStripImage убирает комментарии, иногда заметно уменьшает размер маленьких изображений.
Опытный web-дизайнер знает, что при сильном уменьшении изображения для Web, чтоб картинка выглядела более презентабельно, ей немного добавляют резкости. Параметры наведение резкости зависит от размера картинки, ну и собственно от художественного вкуса дизайнера. Наводим резкость средствами MagickWand:
$magick_wand=NewMagickWand();
MagickReadImage($magick_wand,`linux_users.jpg`);
$mgck_local=MagickTransformImage($magick_wand, NULL,`x100`);
MagickSharpenImage($mgck_local,1,4);
MagickStripImage($mgck_local);
MagickEchoImageBlob($mgck_local);
Теперь сравним результаты, проделаем операцию уменьшения с помощью GD, в режиме по умолчанию и с 100% сохранением качества.
Режим обработки | Изображение |
GD режим "по умолчанию" (2 351 b) Очень маленький размер но потеря качества уже заметна |
|
GD 100% качество (7 847 b) Качество хорошее, GD все делает отлично! |
|
MagickWand "по умолчанию" (9 695 b) Качество хорошее, но размер немного больше! |
|
MagickWand + наведение резкости (14 508 b) Здесь картинка без сомнения выглядит лучше предложенных вариантов! |
|
MagickWand + наведение резкости + качество 0,95 (6 696 b) На мой взгляд, оптимальный вариант, не сильно раздутый размер и заметный выигрыш в качестве. |
|
Выводы делайте сами, в GD не нашел функцию аналогичную Unsharp Mask для Photoshop.
Ставим надпись на иллюстрации
Теперь подпишем иллюстрацию. В этом примере мы увидим, как работает векторная составляющая MagickWand. Для того чтоб все выглядело красиво (со сглаживанием, как в PhotoShop), будем подписывать TrueType шрифтом arial.ttf
$magick_wand=NewMagickWand();
MagickReadImage($magick_wand,`linux_users.jpg`);
$drawing_wand=NewDrawingWand();
DrawSetFont($drawing_wand,"/var/www/img/soap/font/arial.ttf");
DrawSetFontSize($drawing_wand,16);
DrawSetGravity($drawing_wand,MW_SouthEastGravity);
$pixel_wand=NewPixelWand();
PixelSetColor($pixel_wand,"#cd9000");
DrawSetFillColor($drawing_wand,$pixel_wand);
MagickAnnotateImage($magick_wand,$drawing_wand,10,3,0,"Надпись нанесена MagickWand");
MagickStripImage($magick_wand);
MagickEchoImageBlob($magick_wand);
DrawSetGravity - заедает позицию, от которой отчитываются координаты для построения надписи. В нашем случае правый нижний угол.
MagickEchoImageBlob - я использовал для вывода на стандартный вывод, чтоб сбросить все в файл: php lu1.php > fileame.jpg. Для записи иллюстрации в файл используйте MagickWriteImage.
Теперь нанесём полупрозрачную надпись:
$magick_wand=NewMagickWand();
MagickReadImage($magick_wand,`linux_users.jpg`);
$drawing_wand=NewDrawingWand();
DrawSetFont($drawing_wand,"/var/www/img/soap/font/arialbd.ttf");
DrawSetFontSize($drawing_wand,90);
DrawSetGravity($drawing_wand,MW_CenterGravity);
$pixel_wand=NewPixelWand();
PixelSetColor($pixel_wand,"white");
DrawSetFillColor($drawing_wand,$pixel_wand);
#MagickSetImageCompressionQuality($magick_wand, 95);
MagickStripImage($magick_wand);
DrawSetFillOpacity($drawing_wand,0.6);
MagickAnnotateImage($magick_wand,$drawing_wand,0,40,0,"Linux");
MagickEchoImageBlob( $magick_wand );
Поддерживаются TrueType, FreeType, AdobeType. Можно отключить сглаживание. Модуль хорошо документирован, здесь лежит полная документация по MagickWand for PHP
php-magickwand стабилен, уже 3-4 года использую его на production-сервере. Были некоторые проблемы с установкой MagickWand на более ранних версиях Fedora
Есть еще материал по водным знакам и по эфектам PhotoShop на MagickWand, это припасу для следующей статьи, если конечно эта информация была для Вас интересна.
Вернуться в раздел:
Programming /
PHP