Создаем зеркальное отражение изображения с Imagick

Очередной простенький пример применение библиотеки Imagick. На этот раз для получения эффекта зеркального отражения объекта.

Отражение создается таким образом: сначала симметрично нижней границы отображаем картинку, затем отраженную часть заливаем полупрозрачным градиентом. После этого обводим оба изображения одной рамкой для придания эффекта целостности.
Итак, для примера возьмем это изображение и добавим в нему отражение:

Добавим отражение к этой картинке

Добавим отражение к этой картинке

 

Пример работает для Imagick версий старше 2.1.х

  1. <?php
  2.  /* Открываем изображение */
  3. $im = new Imagick( "strawberry.png" );
  4.  
  5. /* Делаем из него тумбу */
  6. $im->thumbnailImage( 200, null );
  7.  
  8. /* Создаем рамку */
  9. $im->borderImage( "white", 5, 5 );
  10.  
  11. /* Клонируем и отображаем клон */
  12. $reflection = $im->clone();
  13. $reflection->flipImage();
  14.  
  15. /* Создаем градиент. Он должен располагаться на отображении */
  16. $gradient = new Imagick();
  17.  
  18. /* Градиент должен быть достаточным для перекрытия изображения */
  19. $gradient->newPseudoImage( $reflection->getImageWidth() + 10,
  20.                            $reflection->getImageHeight() + 10,
  21.                            "gradient:transparent-black"
  22.                         );
  23.  
  24. /* Размещаем градиент на отображении */
  25. $reflection->compositeImage( $gradient, imagick::COMPOSITE_OVER, 0, 0 );
  26.  
  27. /* Немного прозрачности пойдет на пользу */
  28. $reflection->setImageOpacity( 0.3 );
  29.  
  30. /* Создаем пустую канву */
  31. $canvas = new Imagick();
  32.  
  33. /* Канва должна быть достаточных размеров - нам нужно уместить в ней оба изображения */
  34. $width = $im->getImageWidth() + 40;
  35. $height = ( $im->getImageHeight() * 2 ) + 30;
  36. $canvas->newImage( $width, $height, "black", "png" );
  37.  
  38. /* Объединяем оригинальное изображение и отображение на полученной канве */
  39. $canvas->compositeImage( $im, imagick::COMPOSITE_OVER, 20, 10 );
  40. $canvas->compositeImage( $reflection, imagick::COMPOSITE_OVER,
  41.                         20, $im->getImageHeight() + 10 );
  42.  
  43. /* Радуемся достигнутому эффекту */
  44. header( "Content-Type: image/png" );
  45. echo $canvas;

В итоге получаем изображение с отражением:

Изображение с отражением

Изображение с отражением


Вот так просто, быстро и со вкусом!

Оригинал

Запись опубликована в рубрике PHP & MySQL с метками , , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">