Делаем вебдванольные превьюшки с ImageMagick

    Недавно, у меня случилась проблема с GD на сервере — он перестал понимать png, после получаса мытарств, решил посмотреть на ImageMagick и его PHP интерфейс IMagick
    После недолгого гугления нашел замечательный блог посвященный Imagick. Там же нашел способ делать красивые превьюшки. Однако, способ, предложенный там, правильно отрабатывал только с png картинками. Я немного поковырялся и сделал свой.

    Copy Source | Copy HTML
    1. <?php
    2. $thumb = new Imagick();
    3. //читаем картинку по полному пути
    4. $thumb->readImage($fullpath)
    5. //создаем белый фон
    6. $canvas = new Imagick();
    7. $canvas->newImage($width, $height, new ImagickPixel("white"));
    8. //делаем превью, размер меньше, чем у фона, чтобы было куда впихнуть тень
    9. $thumb->thumbnailImage($width-10, $height-10);
    10.  
    11. //наводим резкость, если превью мелкое
    12. if ($width < 300)
    13.     $thumb->sharpenImage(4, 1);
    14.  
    15. //закругляем углы
    16. $thumb->roundCorners(5, 5);
    17. //делаем копию превьюхи, чтобы сделать тень
    18. $shadow = $thumb->clone();
    19.  
    20. //цвет тени
    21. $shadow->setImageBackgroundColor(new ImagickPixel('black'));
    22. //собственно, делаем тень
    23. $shadow->shadowImage(80, 2.5, 5, 5);
    24.  
    25. //накладываем тень на фон98798798999999999999
    26. $canvas->compositeImage($shadow, $shadow->getImageCompose(),  0,  0);
    27. //накладываем превью на фон
    28. $canvas->compositeImage($thumb, $thumb->getImageCompose(),  0,  0);
    29.  
    30. //убираем комменты и т.п. из картинки
    31. $canvas->stripImage();
    32. //записываем картинку
    33. $canvas->writeImage($writeTo);
    34. //подчищаем за собой
    35. $canvas->destroy();
    36. $shadow->destroy();
    37. $thumb->destroy();
    38. ?>

    В итоге получим примерно вот такую картинку;):
    490704de9e6b9.jpg - image uploaded to Picamatic
    upd:то же самое с русскими комментами http://bin.cakephp.org/view/906967763
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 54

      +9
      Спасибо, вы сделали этот мир еще вебдванольней :-)
        +9
        а можно узнать что тут такого вебдванольного?
          +7
          +1… тоже пытаюсь понять что тут вебдванольного.
            +8
            Как что, конечно скругленные углы, без них какой может быть вебдваноль?
              +21
              тогда забыли:
              — мокрый пол
              — блик
              — значок говорящий, что это beta картинка
          +1
          Наверное тень.

          Неудачный пример.
          Блик наверное был бы более вэбдванольнее.
            –2
            «мокрый пол»? =)
            +2
            кенни)))
          +1
          хабр съел часть кода, вот исправленный кусок:
          //place shaвow on the canvas
          $canvas->compositeImage($shadow, $shadow->getImageCompose(), 0, 0);
          //place image on the canvas
          $canvas->compositeImage($thumb, $thumb->getImageCompose(), 0, 0);
          • UFO just landed and posted this here
              +13
              чувство юмора — это по-вашему куча смайлов и кривляние рожей?
              • UFO just landed and posted this here
                  +26
                  окей.
                  [капитан-очевидность]
                  в вышестоящем своем комменте я имел в виду, что не стоит воспринимать название вебдванольные так серьезно, даже если в названии топика нет смайлов и прочей атрибутики.
                  [/капитан-очевидность]
                  для меня веб 2.0 — миф
                    +2
                    <миф>
                    Web 2.0
                    </миф>

                    Абсолютно с вами согласен.
                      +12
                      Новый миф: вебдванольная свежесть.
                0
                а ты случаем незнаешь как из картинки делать квадратные превьюшки? чтобы не искажались пропорции, грубо говоря вырезался квадрат из середины изображения. как, к примеру, на яндекс. фотках превью.

                Сделать я это конечно могу в GD, но может это можно сделать проще с Imagick?
                  +3
                  да, можно, вот тут описано valokuva.org/?p=33
                  • UFO just landed and posted this here
                    0
                    А почему-бы напрямую бинарничек не использовать? Те же курения мана, те же пробы…

                    ЗЫ: к вопросу exec, если не всегда есть доступ к шеллу — не всегда и расширение стоит ;)
                      +3
                      exec медленнее, + OO подход мне ближе
                        0
                        Тесты приведете или оставите свои слова без доказательств?
                        У ооп есть преимущество, конечно… Но, с другой стороны — параметры проще передавать ;)
                          +2
                          valokuva.org/?p=40
                          ссылка вырезалась из коммента
                            0
                            Принято, спасибо :)
                            0
                            есть еще один момент — при использовании интерфейса к php ImageMagick работает в запущенной сессии php, что не всегда бывает хорошо, иногда лучше «скинуть» обработку, вызвав ImageMagick как отдельное приложение
                              0
                              А как это можно сделать?
                                0
                                exec('convert ......');
                            • UFO just landed and posted this here
                              0
                              Можно так, без лишних буферов:
                              passthru("convert /tmp/test.ppm -crop 100x100 jpeg:-");
                            0
                            кстати комментарии лучшеб на русском
                            +1
                            Автор замечательного блога, собственно, является разработчиком пакета imagick — pecl.php.net/user/mkoppanen

                            Кстати, вроде для ImageMagick, есть еще одна обертка для работы с PHP. На хабре про нее писали, но название из головы вылетело.
                            0
                            а в какую сторону стоит копать, если экстеншн стоит и загружен (судя по phpinfo()), а интерпретатор ругается:
                            Fatal error: Class 'Imagick' not found
                              0
                              видимо не стоит сам ImageMagick
                                0
                                дак вот, стоит :(
                                hostX:~# dpkg -l *imagemagick*|grep ii
                                ii imagemagick 6.2.4.5.dfsg1-0.14 Image manipulation programs

                                ii значит стоит
                                  0
                                  тогда shell вам в руки, или покопаться в php.ini, может там что то поправить надо…
                                +1
                                У ImageMagic много различных модификаций. Работать с ним как с классом позволяют далеко не все.

                                В вашем случае у вас скорее всего доступны функции начинающиеся на imagick_ (напр. imagick_readimage — вместо IMagick::readImage).

                                Как лекарство — установить нормальную версию Imagick — ru2.php.net/manual/ru/imagick.setup.php и imagemagick.org/.
                                  0
                                  Спасибо!
                                  Собрал экстеншн из исходников и все сразу заработало
                                +1
                                Все это прекрасно делается с помощью css-магии
                                  0
                                  с помощью CSS можно «сжать» большую картинку, можно приделать углы круглые при желании, но средствами стилевых таблиц реальную тумбу (занимающую, что не маловажно, значительно меньше времени загрузки и трафика, оригинальная) не сделать
                                    0
                                    а с помощью уличной магии, можно телепортировать большие картинки в тумбы моментально =)
                                      0
                                      с предварительной загрузкой полного изображения?
                                      а если это превьюшки галлереи?
                                        0
                                        Я про закругления и тени.
                                        Сегодня это такие закругления, а завтра это обрезанные под 45 градусов углы. Т. ч. css тут рулит
                                        И карму минусовать незачем было :)
                                          0
                                          css не пережимает картинки в превьюшки.
                                          основная идея поста в том, чтобы сделать превьюхи более симпатичными, вот и все.
                                          ЗЫ кому то ближе css, кому-то php, я не люблю верстку, поэтому делаю как люблю:)
                                            0
                                            Вы совершенно не вникаете в текст комментариев
                                      0
                                      круто ) в закладки :)
                                        +1
                                        а вот я для себя нашел эту инфу полезной.
                                        а веб2.0 или нет — это уже кому-как нравится.

                                        автор спасибо!
                                          +1
                                          В свое время нужно было написать небольшую галерейку, все делалось на GD, поскольку IM у хостера небыло.
                                          ImageMagic сильная штука, такое с фотками можно вытворять.
                                          Спасибо за небольшой материальчик, крайне полезный.
                                            +1
                                            www.liveinternet.ru/users/alinaki/post33093197/

                                            А вообще у них руководство крутое на офсайте.
                                              0
                                              картинка офигенная :)
                                                0
                                                а я уже в которой статье не могу картинки видеть — picamatic.com в Китае не открывается :(((
                                                понимаю, бессмысленно призывать авторов пользоваться другим сервисом, но вот так обстоят дела
                                                  0
                                                  мне просто лениво было выкладывать на яндекс. фотки

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