Русские документы
Ежедневные компьютерные новости RSS rusdoc.ru  Найти :
Новости
Последние поступления
Книжный магазин
  Hardware:
Видеоустройства
Системные платы
Процессоры
Мобильные устройства
Аудиосистема
Охлаждение системы
Накопители информации
КПК и ноутбуки
Телефоны и связь
Периферия
Система
Сети
Разные устройства
 
  Programming:
Web-разработка
Языки программирования
Технологии и теория
Разработка игр
Программная инженерия
 
  Software:
Операционные системы
Windows 7
Базы данных
Обзоры программ
Графика и дизайн
   
  Life:
Компьютерная жизнь
Разные материалы
   
Партнеры
Публикация
Правовая информация
Реклама на сайте
Обратная связь
Экспорт в RSS Экспорт в RSS2.0
    Читать в Яндекс.Ленте



Фотошопим на 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


Реклама:
Читать наc на:

Add to Google
Читать в Яндекс.Ленте






Rambler's Top100
© Copyright 1998-2012 Александр Томов. All rights reserved.