Русские документы
Ежедневные компьютерные новости RSS rusdoc.ru  Найти :
http://www.rusdoc.ru. Версия для печати.

Фотошопим на 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
© Copyright 1998-2012 Александр Томов. All rights reserved.