Добавление водяных знаков на изображения с помощью альфа-каналов
Пример #1 Добавление водяных знаков на изображения с помощью альфа-каналов
<?php
// Загрузка штампа и фото, для которого применяется водяной знак (называется штамп или печать)
$stamp = imagecreatefrompng('stamp.png');
$im = imagecreatefromjpeg('photo.jpeg');
// Установка полей для штампа и получение высоты/ширины штампа
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);
// Копирование изображения штампа на фотографию с помощью смещения края
// и ширины фотографии для расчета позиционирования штампа.
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
// Вывод и освобождение памяти
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>

Коментарии
function addWatermark($sourceImage, $watermarkImage, $outputPath) {
// Загружаем исходное изображение и водяной знак
$source = imagecreatefromstring(file_get_contents($sourceImage));
$watermark = imagecreatefromstring(file_get_contents($watermarkImage));
// Получаем размеры изображений
$sourceWidth = imagesx($source);
$sourceHeight = imagesy($source);
$watermarkWidth = imagesx($watermark);
$watermarkHeight = imagesy($watermark);
// Размер блока для анализа (можно настроить)
$blockSize = max($watermarkWidth, $watermarkHeight);
$darkestX = 0;
$darkestY = 0;
$darkestValue = 255;
// Проходим по изображению блоками
for ($x = 0; $x <= $sourceWidth - $blockSize; $x += $blockSize) {
for ($y = 0; $y <= $sourceHeight - $blockSize; $y += $blockSize) {
$totalBrightness = 0;
$pixelCount = 0;
// Вычисляем среднюю яркость блока
for ($px = $x; $px < min($x + $blockSize, $sourceWidth); $px++) {
for ($py = $y; $py < min($y + $blockSize, $sourceHeight); $py++) {
$rgb = imagecolorat($source, $px, $py);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
// Вычисляем яркость пикселя
$brightness = ($r + $g + $b) / 3;
$totalBrightness += $brightness;
$pixelCount++;
}
}
$averageBrightness = $totalBrightness / $pixelCount;
// Если это самый темный блок, сохраняем его координаты
if ($averageBrightness < $darkestValue) {
$darkestValue = $averageBrightness;
$darkestX = $x;
$darkestY = $y;
}
}
}
// Добавляем водяной знак в самую темную область
imagecopy(
$source,
$watermark,
$darkestX,
$darkestY,
0,
0,
$watermarkWidth,
$watermarkHeight
);
// Сохраняем результат
switch (strtolower(pathinfo($outputPath, PATHINFO_EXTENSION))) {
case 'jpg':
case 'jpeg':
imagejpeg($source, $outputPath, 90);
break;
case 'png':
imagepng($source, $outputPath);
break;
case 'gif':
imagegif($source, $outputPath);
break;
}
// Освобождаем память
imagedestroy($source);
imagedestroy($watermark);
}
// Пример использования:
$sourceImage = 'path/to/source.jpg';
$watermarkImage = 'path/to/watermark.png';
$outputPath = 'path/to/output.jpg';
addWatermark($sourceImage, $watermarkImage, $outputPath);