Водяной знак — это картинка поверх изображения. Способ маркировки, защиты и эстетики. И если ты хочешь сделать это правильно — с учётом прозрачности, формата .webp, сохранения качества и адекватного позиционирования — эта статья для тебя.

Что нам нужно

  • PHP ≥ 7.4
  • Расширение Imagick (обёртка над ImageMagick)
  • Оригинальное изображение любого типа (.jpg, .png, .webp)
  • Прозрачный .png файл с водяным знаком

Зачем использовать Imagick, а не GD

GD библиотека в PHP — старичок, и да, она справляется с базовыми задачами. Но вот тебе правда:

  • GD криво работает с альфой в .webp
  • Наложение прозрачных PNG часто теряет альфу
  • Сложно масштабировать watermark
  • Нет нормальной поддержки цветовых профилей

Imagick решает всё это из коробки. Работает стабильно, быстро, и сохраняет всё как надо — даже если ты работаешь с прозрачными слоями и современными форматами.


Суть процесса

  1. Загружаем оригинальное изображение
  2. Загружаем watermark с прозрачностью
  3. Масштабируем watermark при необходимости
  4. Определяем позицию
  5. Накладываем watermark поверх изображения
  6. Сохраняем результат как .webp (с прозрачностью)

Пример кода: прозрачный watermark поверх любого изображения

<?php
$source_path   = __DIR__ . '/original.jpg';          // Оригинал
$watermark_path = __DIR__ . '/watermark.png';        // Водяной знак
$output_path    = __DIR__ . '/result.webp';          // Куда сохранить

$image = new Imagick($source_path);
$image->setImageFormat('webp');
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE);
$image->setBackgroundColor(new ImagickPixel('transparent'));

$width  = $image->getImageWidth();
$height = $image->getImageHeight();

$watermark = new Imagick($watermark_path);
$watermark->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE);
$watermark->evaluateImage(Imagick::EVALUATE_MULTIPLY, 1.0, Imagick::CHANNEL_ALPHA);

// Масштабируем watermark до 30% ширины изображения
$target_wm_width = $width * 0.3;
$watermark->resizeImage($target_wm_width, 0, Imagick::FILTER_LANCZOS, 1);

// Пересчитываем размер
$wm_width  = $watermark->getImageWidth();
$wm_height = $watermark->getImageHeight();

// Позиция: правый нижний угол с отступами
$pos_x = $width - $wm_width - 20;
$pos_y = $height - $wm_height - 20;

// Накладываем
$image->compositeImage($watermark, Imagick::COMPOSITE_OVER, $pos_x, $pos_y);

// Сохраняем как .webp
$image->writeImage($output_path);

// Очистка
$image->clear();
$watermark->clear();

echo "✅ Водяной знак наложен: $output_path";

Результат

  • Поддержка прозрачности: watermark остаётся полупрозрачным (если у него есть альфа)
  • Формат .webp: современный, лёгкий, совместимый
  • Позиционирование: по правому нижнему краю, можно легко менять
  • Масштабирование: watermark не залезает на полэкрана, аккуратно адаптируется

Что можно улучшить

  • Сделать watermark центральным
  • Добавить текстовую подпись, а не только PNG
  • Поддерживать watermark в несколько позиций (углы, центр, повтор)
  • Автоматически адаптировать watermark под вертикальные изображения

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

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