Mam obraz (nazwijmy go: oryginalny obraz), na którym chcę umieścić znak wodny innego obrazu (nazwijmy go: logo).
logo to przezroczysty plik PNG, natomiast oryginalny obraz może być png, jpg lub gif.
Mam następujący kod:Korzystając z GD w PHP, w jaki sposób mogę utworzyć przezroczysty znak wodny PNG na plikach PNG i GIF? (Pliki JPG działają bez zarzutu)
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);
}
Ten kod działa dobrze (dobrze = zachować przejrzystość logo) tylko wtedy, gdy oryginalny obrazto plik JPG.
Gdy oryginalny plik jest plikiem GIF lub PNG, logo ma białe tło, co oznacza, że przezroczystość nie działa.
Dlaczego? Co muszę zmienić, żeby zadziałało?
Dzięki
UPDATE:
Oto moja recoded wersja:
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);
}
To może być pomocne [PHP + GD: imagecopymerge nie zachowując PNG przezroczystości] (http://stackoverflow.com/questions/3355993/phpgd-imagecopymerge-not-retaining-png-transparencies/3356419#3356419). – Mike
@doron Dzięki za przykładowy kod. – vee