Используя GD в PHP, как сделать прозрачный водяной знак PNG для файлов PNG и GIF? (JPG файлы работают нормально) - PullRequest
9 голосов
/ 14 декабря 2010

У меня есть изображение (назовем его исходное изображение ), на котором я хочу нанести водяное изображение на другое изображение (назовем его logo ).
logo является прозрачным PNG, тогда как исходное изображение может быть png, jpg или gif.
У меня есть следующий код:

function watermarkImage($originalFileContents, $originalWidth, $originalHeight) {
    $logoImage = imagecreatefrompng('logo.png');
    imagealphablending($logoImage, true);

    $logoWidth  = imagesx($logoImage);  
    $logoHeight = imagesy($logoImage);

    $originalImage = imagecreatefromstring($originalFileContents);

    $destX = $originalWidth  - $logoWidth;
    $destY = $originalHeight - $logoHeight;

    imagecopy(
        // source
        $originalImage,
        // destination
        $logoImage,
        // destination x and y
        $destX, $destY,
        // source x and y
        0, 0,
        // width and height of the area of the source to copy
        $logoWidth, $logoHeight
    );
    imagepng($originalImage);
}

Этот код работает хорошо (хорошо= сохранять прозрачность логотипа ) только в том случае, если исходное изображение является файлом JPG.
Когда исходный файл представляет собой GIF или PNG,Логотип имеет сплошной белый фон, что означает, что прозрачность не работает.

Почему?Что мне нужно изменить, чтобы оно работало?
Спасибо

ОБНОВЛЕНИЕ:
Вот моя перекодированная версия:

function generate_watermarked_image($originalFileContents, $originalWidth, $originalHeight, $paddingFromBottomRight = 0) {
    $watermarkFileLocation = 'watermark.png';
    $watermarkImage = imagecreatefrompng($watermarkFileLocation);
    $watermarkWidth = imagesx($watermarkImage);  
    $watermarkHeight = imagesy($watermarkImage);

    $originalImage = imagecreatefromstring($originalFileContents);

    $destX = $originalWidth - $watermarkWidth - $paddingFromBottomRight;  
    $destY = $originalHeight - $watermarkHeight - $paddingFromBottomRight;

    // creating a cut resource
    $cut = imagecreatetruecolor($watermarkWidth, $watermarkHeight);

    // copying that section of the background to the cut
    imagecopy($cut, $originalImage, 0, 0, $destX, $destY, $watermarkWidth, $watermarkHeight);

    // placing the watermark now
    imagecopy($cut, $watermarkImage, 0, 0, 0, 0, $watermarkWidth, $watermarkHeight);

    // merging both of the images
    imagecopymerge($originalImage, $cut, $destX, $destY, 0, 0, $watermarkWidth, $watermarkHeight, 100);
}

1 Ответ

6 голосов
/ 14 декабря 2010

imagecopy не поддерживает использование двух изображений с альфа-каналами. взгляните на imagecopymerge.

http://php.net/manual/en/function.imagecopymerge.php

В разделе комментариев пользователей есть множество примеров и законченная реализация того, что вы хотите:

http://www.php.net/manual/en/function.imagecopymerge.php#92787

...