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

У меня есть изображение (назовем его оригинальным изображением ), на котором я хочу пометить другое изображение (назовем его логотипом ).
Логотип представляет собой прозрачный 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); } 

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

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

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

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