Водяной знак

Простые и более сложные варианты сделать водяной знак на изображении используя Imagick. Его можно использовать на любом веб-сайте или приложении, но возможности Imagick ограничиваются обычным текстом в отличии от плагинов «Водяной знак для WordPress».

Оглавление:
  1. Рисуем текст на изображении
  2. Прозрачный текст
  3. Текст плиткой

В документации Imagick API есть много примеров командных строк, их можно найти на сайте ImageMagick, с этого и начнём. Преобразование командной строки кода из примеров в PHP — это просто утомительный процесс, он выполняет одни и те же функции.

Для этого примера будет использоваться совершенно случайное изображение.

Случайное изображение
Случайное изображение

Водяной знак

Рисуем текст на изображении

Самый простой способ нарисовать водяной знак — это строка наложенная поверх изображения.

PHP

<?php // Создать объекты 
$image = new Imagick('image.png'); 

// Текст на изображении
$text = 'Copyright';

// Создать новый шаблон
$draw = new ImagickDraw(); 

// Свойства шрифта
$draw->setFont('Arial');
$draw->setFontSize(20);
$draw->setFillColor('black');

// Положение текста
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);

// Нарисовать текст на изображении
$image->annotateImage($draw, 10, 12, 0, $text);

// Рисовать текст с другим цветом
$draw->setFillColor('white');
$image->annotateImage($draw, 11, 11, 0, $text);

// Формат изображения
$image->setImageFormat('png');

// Изображение на выходе
header('Content-type: image/png');
echo $image;
?>

Результат:

Простой пример Text Watermarks
Текст на изображении

Но текст на изображении получается слишком резкий.

к меню ↑

Прозрачный текст

Для более плавного эффекта текста водяного знака, можно сделать текст немного прозрачным используя Mask.

PHP

<?php // Создать объекты 
$image = new Imagick('image.png'); 
$watermark = new Imagick(); 
$mask = new Imagick(); 
$draw = new ImagickDraw(); 

// Определить размеры
$width = $image->getImageWidth();
$height = $image->getImageHeight();

// Создать палитры
$watermark->newImage($width, $height, new ImagickPixel('grey30'));
$mask->newImage($width, $height, new ImagickPixel('black'));

// Текст на изображении
$text = 'Copyright';

// Свойства шрифта
$draw->setFont('Arial');
$draw->setFontSize(20);
$draw->setFillColor('grey70');

// Положение текста
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);

// Нарисовать текст на палитре водяного знака
$watermark->annotateImage($draw, 10, 12, 0, $text);

// Нарисовать текст на палитре маски
$draw->setFillColor('white');
$mask->annotateImage($draw, 11, 13, 0, $text);
$mask->annotateImage($draw, 10, 12, 0, $text);
$draw->setFillColor('black');
$mask->annotateImage($draw, 9, 11, 0, $text);

// Для работы маски
$mask->setImageMatte(false);

// Нанесение маски на водяной знак
$watermark->compositeImage($mask, Imagick::COMPOSITE_COPYOPACITY, 0, 0);

// Наложение водяного знака на изображение
$image->compositeImage($watermark, Imagick::COMPOSITE_DISSOLVE, 0, 0);

// Формат изображения
$image->setImageFormat('png');

// Изображение на выходе
header('Content-type: image/png');
echo $image;
?>

Результат:

Прозрачный текст watermark с помощью шрифта Mask
Прозрачный текст используя Mask

Первое изображение водяной знак $watermark на сером фоне, второе изображение $mask использует черный цвет для части текста, а белая часть текста сохранилась. Когда изображения объединяются, любые оттенки серого $mask сглаживаются и текст будет полупрозрачным.

к меню ↑

Текст плиткой

Текст будет по всему изображению, его будет труднее удалить с изображения.

PHP

<?php // Создать объекты
$image = new Imagick('image.png'); 
$watermark = new Imagick(); 

// Текст водяного знака
$text = 'Copyright'; 

// Создать новый шаблон
$draw = new ImagickDraw(); 
$watermark->newImage(140, 80, new ImagickPixel('none'));

// Указать свойства шрифта
$draw->setFont('Arial');
$draw->setFillColor('grey');
$draw->setFillOpacity(.5);

// Положение текста
$draw->setGravity(Imagick::GRAVITY_NORTHWEST);

// Рисуем текст водяного знака
$watermark->annotateImage($draw, 10, 10, 0, $text);

// Положение текста
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);

// Рисуем текст водяного знака
$watermark->annotateImage($draw, 5, 15, 0, $text);

// Наложение водяного знака на изображение
for ($w = 0; $w < $image->getImageWidth(); $w += 140) {
    for ($h = 0; $h < $image->getImageHeight(); $h += 80) {
        $image->compositeImage($watermark, Imagick::COMPOSITE_OVER, $w, $h);
    }
}

// Формат изображения
$image->setImageFormat('png');

// Изображение на выходе
header('Content-type: image/png');
echo $image;
?>

Результат:

Плиточный текст Watermarks
Текст плиткой

прозрачность устанавливается в setFillOpacity(), а не в маске.

htmlhook.ru | Скрипты для веб-приложений