ToxaDab
Web разработка
Как наложить водяной знак на изображение с прозрачностью: PHP + Imagick
Водяной знак — это картинка поверх изображения. Способ маркировки, защиты и эстетики. И если ты хочешь сделать это правильно — с учётом прозрачности, формата .webp
, сохранения качества и адекватного позиционирования — эта статья для тебя.
Что нам нужно
- PHP ≥ 7.4
- Расширение Imagick (обёртка над ImageMagick)
- Оригинальное изображение любого типа (
.jpg
,.png
,.webp
) - Прозрачный
.png
файл с водяным знаком
Зачем использовать Imagick
, а не GD
GD
библиотека в PHP — старичок, и да, она справляется с базовыми задачами. Но вот тебе правда:
- GD криво работает с альфой в
.webp
- Наложение прозрачных PNG часто теряет альфу
- Сложно масштабировать watermark
- Нет нормальной поддержки цветовых профилей
Imagick решает всё это из коробки. Работает стабильно, быстро, и сохраняет всё как надо — даже если ты работаешь с прозрачными слоями и современными форматами.
Суть процесса
- Загружаем оригинальное изображение
- Загружаем watermark с прозрачностью
- Масштабируем watermark при необходимости
- Определяем позицию
- Накладываем watermark поверх изображения
- Сохраняем результат как
.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
для наложения водяного знака — это профессиональный способ, который не просто работает, а делает это правильно: с прозрачностью, современными форматами, гибкой настройкой и высоким качеством итоговой картинки.
И если ты делаешь сайт, галерею, маркетплейс или просто хочешь защитить свои изображения — не экономь на качестве. Водяной знак — это подпись. Пусть она будет читаемой.