Фотошопим на PHP

    Уменьшаем изображение разными библиотеками и сравниваем результат Для многих задач автоматической обработки фотографий не подходит качество и функционал библиотеки 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% сохранением качества.

    Есть еще материал по водным знакам и по эфектам PhotoShop на MagickWand, это припасу для следующей статьи, если конечно эта информация была для Вас интересна.
    Режим обработки Изображение
    GD режим «по умолчанию» (2 351 b)
    Очень маленький размер но потеря качества уже заметна
    GD 100% качество (7 847 b)
    Качество хорошее, GD все делает отлично!
    MagickWand «по умолчанию» (9 695 b)
    Качество хорошее, но размер немного больше!
    MagickWand + наведение резкости (14 508 b)
    Здесь картинка без сомнения выглядит лучше предложенных вариантов!

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 31

      0
      Спасибо!
      Пошёл читать и тестить.
      • UFO just landed and posted this here
          –1
          "Сдесь" и "матерриалы" портят оформление отличной идеи. За идею - двойное спасибо ;)
            0
            и еще "несколько 3-4 года", а также "результатиы, продалаем", "заметную", "чтоб", "собствнно".
            Надо проверять хотя бы вордом, или гуглом, "потому что он исправляет слова, в которых больше одной ошибки" ©bash.
              +1
              Спасибо за замечание, действительно забыл проверить на грамотность. Уже исправил.
                0
                да ничего ;) с кем не бывает.
            +1
            Спасибо, интересно, мы тоже выбрали ImageMagick для своего проекта.
            На мой взгляд, у вас шарпинг чрезмерен
            Вот www.xl-tour.ru/imagick/cmd.php мой программист написал скриптик, позволяющий на примере одной фотки поиграться с шарпингом и качеством файла при обработке через ImageMagick.
            Пока мы для себя выбрали следующие параметры:
            convert result.jpg -resize 600x -unsharp 0.2x0+300+0 –compress JPEG -quality 80 result.jpg

            Сравнивали с фотошопом, он при тех же параметрах шарпинга, и качестве сохранения 51% делает фотографии чуть меньше и чуть лучше. К сожалению, перегнать фотошоп нам пока не удалось.
              0
              Adobe всегда славился своими конвертерами, тут уж ничего не поделать.
                0
                Согласен, но так нагляднее. В нашем деле не бывает правильной цифры :), шарпинг зависит и от размера фотографии чем меньше превьюшка - тем аккуратнее нужно наводить резкость.
                +2
                Пост — в закладки, спасибо — в карму;-)
                  –1
                  Ананлогично :)
                  0
                  Огромное спасибо! Проектируем фотохостинг и буквально позовчера встала именна эта проблема, проблема в качестве и четкости превьюшек.
                  Прямо по щучьему велению. :-)
                    +2
                    о! обращаюсь к вам как к доблесным разработчикам в будущем великого фотохостинга:
                    1. не убирайте картинки, на которые идет большая нагрузка!
                    2. прикрутите статистику просмотров и т.п.
                    3. и апи, да
                    0
                    Вот сколько ни вглядывался, разницы между изображениями, кроме как с первым, не заметил...
                      +1
                      Возможно, я выбрал не совсем удачную фотку, которая для меня ассоциируется с GNU/Linux-сообществом :). Тогда я попробую продемонстрировать разницу на примере фото Ричарда Столлмана:
                      Фото Ричарда Мэттью Столлмана, до шарпинга MagickWandФото Ричарда Мэттью Столлмана, после шарпинга MagickWand
                      Разницу можно увидеть в мелких деталях: борода, глаза, рот. Я специально для MagickWand поставил 100% качество, чтоб на разницу не влияла компрессия. Параметры Шарпинга те же: MagickSharpenImage($mgck_local,1,4)
                      0
                      Здорово, что хоть кто-то решился написать о данной библиотеке. Буквально только позавчера тут говорили о том, что PHP+GD1/2 стандартный вариант, но PHP+IM все же мощнее. Единственно что меня в MagickWand смещает это не всегда понятная документация (местами вообще было не ясно, что же имел в виду автор документации) и практически полное отсутсвие примеров. Ну и процедурный стиль конечно тоже немного напрягает.

                      Имхо, IM в рунете освещен не очень хорошо.

                      Автору спасибо. Мог бы, поставил бы плюс.
                        0
                        стиль процедурный, но подход объектно-ориентированный. Практически все методы используют id-шник созданного wand'а в качестве первого параметра. Это типично для нскоро портированных в ОО язык чисто-сишных API. Такая же ситуация в curl'е. Это нормально. кроме того несложно написать обёртку, выглядящю как нормальный OO API.

                        Кстати про работу с текстом и вектором в "классическом ImageMagick" (видимо имеется ввиду commnd-line интерфейс) автор обманывает: из коммандной строки convert умеет абсолютно всё, что умеет библиотека MagickWand.

                        собственно, я пользуюсь комманд-лайном - это позволяет одновременно и ворочать большие картинки и не выделять php для этого кучу памяти, которую если разрешить он потенциально может отъесть в других местах, не связанных с графикой (чего я не хочу [-: ).
                        0
                        Спасибо. Как-то раз заказчик как раз жаловался на качество превьюшек. Я не знал, что ему ответить и ссылался на ограничения технических средств. :) Теперь все встало на свои места.
                        • UFO just landed and posted this here
                            0
                            о сенкс, про шарпинг актуально.
                              0
                              IM при ресайзе чуть быстрее на больших картинках (более 6000x6000 px), на маленьких (типа обоев на рабочий стол) разницы не заметил.

                              Вообще сравнивать phpThumbs и IM не совсем корректно, ибо thumbs использует IM если он установлен, и только в крайнем случае обращается к GD. Я, кстати, вообще не уверен, что он умеет шарпинг на чистом GD - не пробовал. (-:
                              0
                              кстати, очень жаль, что IM активно не развивается вот уже много лет. Активно - я под этим понимаю написание новых фильтров и улучшение удобства работы с утилитой convert (там очень неудобна для понимания система "гравитации" при нарезке изображений). Например очень не хватает фильтров, которые "вытягивают" недодержанные участки изображения или создают блики в ярких местах, итп.
                                0
                                А мы для Unsharp используем Unsharp Mask for PHP - которая замечательно работает с GD.

                                http://vikjavev.no/computing/ump.php
                                  0
                                  Не знал об этой библиотеке, спасибо что написали.

                                  Это не функция движка GD, она написана на самом php и как вы, сами понимаете, она очень заметно проигрывает в скорости.

                                  Я 100 раз сделал шарпинг с помощью Unsharp Mask for PHP вышеупомянутому фото - это заняло 17 секунд, аналогичная операция на MagickWand заняла 0,6 секунды (Почти в 30 раз медленее!). А если шарпить прийдется 640x480 тогда потеря производительности будет гораздо ощутимее.

                                  Качество шарпинга с натяжкой можно стравнивать с MagickWand.
                                    0
                                    С качеством я поспешил делать выводы. Когда установил идентичные параметры шарпинга, "на-глаз", разницу с MagickWand не увидел.

                                    Проблема останется только в производительности, упомянутой Вами, функции.
                                    0
                                    Как по мне, то документация не ахти, да и либа не самая адекватная (производительность на высоте но стабильность ...).
                                    Например под Freebsd есть проект который использует ф-цию MagickPaintOpaqueImage, перенесли проект под Linux(ubuntu), перестало работать, оказалось не знает magickwand такую ф-цию MagickPaintOpaqueImage, далее пришло обновление и для фри, и те же пироги, все лягло, просто исчезла функция :(
                                    • UFO just landed and posted this here
                                        0
                                        Обновите ImageMagick или поставте MagickWand 1.0.6.

                                        В новом ImageMagick, конфигуратор называется MagickWand-config а не Wand-config
                                        0
                                        Пожалуйста, подскажите, чем лучше нарезать на кусочки фиксированного размера (256x256) очень большую картинку (tiff) с разрешением 17002x19002 *750мб) точек (и еще одну картинку 27000x20000 н 1.56гб)
                                        convert из ImageMagick у меня на первой картинке уходит думать в вечность,
                                        а на второй просто вылетает по недостатку памяти.
                                        Фотошоп открывает, но там я не знаю, как это автоматизировать.
                                          0
                                          Я не пользуюсь convert (работа из консоли очень ограничивает возможности этой библиотеки, кроме того вы не можете определить как каком этапе ImageMagick "уходит в космос").

                                          Мои пользователи не заливают мне файлы такого разрешения :). Поєтому дам рекомендации исходя из того как решал бы проблему я.

                                          Поделим все на этапы:

                                          1. Увеличьте в php максимальный предел загребаемого ОЗУ, примерно так
                                          ini_set('memory_limit', '2048M');
                                          set_time_limit(0);


                                          2. Загрузите изображение в память
                                          $magick_wand=NewMagickWand();
                                          MagickReadImage($magick_wand,'my_big.tif');


                                          3. Если эти этапы прошли, напишите прогу которая будет вырезать куски, этого я за Вас делать не буду.

                                          Главное в во всем этом то, что вы можете видеть на каком шаге затык! Ну в крайнем случае RAM в комп добавте :). У меня на серваке 8G стоит, думаю он бы проглотил имидж в полтора гига.
                                            0
                                            Понятно, будем пробовать,
                                            хотя на моем сервере только 2мб памяти :(
                                            Просто, я надеялся, что есть программное решение, позволяющее резать картинку на кусочки без создания ее полного образа в памяти.
                                            Одна из таких программ у меня есть, но она вообще не имеет настроек и на выходе выдает jpeg с фиксированными параметрами компресии, но зато "стрижет" такие картинище на картинки очень быстро (за 1-3 минуты) и памяти почти не требует.
                                            Результат нарезки:
                                            www.kartaspb.ru
                                            www.oblmap.spb.ru
                                            Хотел переделать формат на gif/png с индексными палитрами и сжатием без потерь (думал, что будут получаться файлы меньшего размера и лучшего качества), но простого способа пока не нашел.

                                        Only users with full accounts can post comments. Log in, please.