Водяные знаки на php с Imagick

В продолжение ликбеза по работе с Imagick, покажу простой код нанесения водяных знаков на изображение, чтобы как-то обозначить его владельца. Водяные знаки довольно популярны в вебе. Их ставят все, кому не лень. По делу и просто так. Порой приходится видеть совершенно одинаковые изображения, различающиеся лишь вотемарками. Итак, как же сделать эти самые вотемарки на php?

  1. <?php
  2. /* Создаем объект Imagick */
  3. $im = new Imagick( 'example.png' ); 
  4.  
  5. /* Создаем объект  ImagickDraw и задаем ему размер шрифта*/ 
  6. $draw = new ImagickDraw();
  7. $draw->setFontSize( 30 ); 
  8.  
  9. /* Устанавливаем прозрачность надписи */
  10. $draw->setFillAlpha( 0.4 );
  11.  
  12. /* Устанавливаем положение надписи */ 
  13. $draw->setGravity( Imagick::GRAVITY_CENTER ); 
  14.  
  15. /* Наносим надпись на изображение: 
  16.     Позиция по x, y (начало координат ведется от центра изображения, поскольку выше мы указали GRAVITY_CENTER)
  17.     Поворот 0 градусов.
  18.     Текст вотемарки
  19. */ 
  20. $im->annotateImage( $draw, 0, 0, 0, "All right reserved" );
  21.  
  22. /* Выводим на экран */ 
  23. header( "Content-Type: image/{$im->getImageFormat()}" ); 
  24. echo $im;

В итоге получим изображение, с нанесеннным в самом центре текстом «All right reserved». Быстро и просто? Да. Но есть одно но. В данном примере я не менял цвет наносимой записи, по умолчанию она будет черного цвета. Однако черную надпись на черной картинке видно не будет. Смысл от водяного знака пропадает. Поэтому немного доделаем код.

  1. <?php
  2. /* Создаем объект Imagick и устанавливаем формат - png. */
  3. $image = new Imagick( $img  );
  4. $image->setImageFormat( "png" );
  5.  
  6. /* Текст, который будем писать на изображении */
  7. $text = "example";
  8.  
  9. /* Объект ImagickDraw будет содержать настройки шрифта надписи */
  10. $draw = new ImagickDraw();
  11.  
  12. /* Устанавливаем положение надписи */
  13. $draw->setGravity( Imagick::GRAVITY_CENTER );
  14.  
  15. /* Задаем TrueType шрифт */
  16. $draw->setFont( "./WCManoNegraBta.ttf" );
  17.  
  18. /* Размер шрифта */
  19. $draw->setFontSize( 26 );
  20.  
  21. /* Создаем еще один объект Imagick*/
  22. $im = new imagick();
  23.  
  24. /* Получаем характеристики для шрифта, заданного выше */
  25. $properties = $im->queryFontMetrics( $draw, $text );
  26.  
  27. /* Определяем положение надписи, по краям будут небольшие отступы  */
  28. $watermark['w'] = (int)$properties["textWidth"] + 5;
  29. $watermark['h'] = (int)$properties["textHeight"] + 5;
  30.  
  31. /* CСоздаем прозрачную канву */
  32. $im->newImage( $watermark['w'], $watermark['h'], 
  33.                     new ImagickPixel( "transparent" ) );
  34.  
  35. /* Задаем регион для расположения надписи, чтобы пройтись по пикселам и определить какого цвета стоит нанести вотемарку */
  36. $it = $image->getPixelRegionIterator( 0, 0, $watermark['w'], $watermark['h'] );
  37.  
  38. $luminosity = 0;
  39. $i = 0;
  40.  
  41. while( $row = $it->getNextIteratorRow() )
  42. {
  43.         foreach ( $row as $pixel )
  44.         {
  45.                 $hsl = $pixel->getHSL();
  46.                 $luminosity += $hsl['luminosity'];
  47.                 $i++;
  48.         }
  49. }
  50.  
  51. /* Задаем цвет в зависимости от фона. Если усредненная яркость больше 0.5 - текст будет белым, иначе - черным (напомню, что яркость - это уровень черного в изображении) */
  52. $textColor = ( ( $luminosity / $i )> 0.5 ) ?
  53.                         new ImagickPixel( "black" ) :
  54.                         new ImagickPixel( "white" );
  55.  
  56. /* Устанавливаем этот цвет для тени */
  57. $draw->setFillColor( $textColor );
  58.  
  59. /* Преобразуем к png */
  60. $im->setImageFormat( "png" );
  61.  
  62. /* Размещаем текст на изображении */
  63. $im->annotateImage( $draw, 0, 0, 0, $text );
  64.  
  65. /* Клонируем канву для создания тени */
  66. $watermark = $im->clone();
  67.  
  68. /* Заливаем фон */
  69. $watermark->setImageBackgroundColor( $textColor );
  70.  
  71. /* Создаем тень */
  72. $watermark->shadowImage( 80, 2, 2, 2 );
  73.  
  74. /* Сливаем текст с фоном */
  75. $watermark->compositeImage( $im, Imagick::COMPOSITE_OVER, 0, 0 );
  76.  
  77. /* Наносим водяной знак на изображение */
  78. $image->compositeImage( $watermark, Imagick::COMPOSITE_OVER, 0, 0 );
  79.  
  80. /* Наслаждаемся результатами */
  81. header( "Content-Type: image/png" );
  82. echo $image;

Вот так можно получить универсально подходящие по цвету водяные знаки на изображении с использованием библиотеки Imagick.
Оригинал

Запись опубликована в рубрике 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="">