Добавление водяных знаков на изображения с помощью альфа-каналов

Пример #1 Добавление водяных знаков на изображения с помощью альфа-каналов

<?php
// Загрузка штампа и фото, для которого применяется водяной знак (называется штамп или печать)
$stamp imagecreatefrompng('stamp.png');
$im imagecreatefromjpeg('photo.jpeg');

// Установка полей для штампа и получение высоты/ширины штампа
$marge_right 10;
$marge_bottom 10;
$sx imagesx($stamp);
$sy imagesy($stamp);

// Копирование изображения штампа на фотографию с помощью смещения края
// и ширины фотографии для расчета позиционирования штампа. 
imagecopy($im$stampimagesx($im) - $sx $marge_rightimagesy($im) - $sy $marge_bottom00imagesx($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);
2025-02-11 12:00:47
http://php5.kiev.ua/manual/ru/image.examples-watermark.html

    Поддержать сайт на родительском проекте КГБ