GD: сделать белый фон для PNG прозрачным - PullRequest
1 голос
/ 11 ноября 2010

У меня есть изображение водяного знака PNG с прозрачным фоном.Но случайно он генерирует белый фон вместо того, чтобы оставаться прозрачным.

// Watermark
$watermark = imagecreatefrompng($docRoot . '/images/misc/watermark.png');
list($mwidth, $mheight) = getimagesize($docRoot . '/images/misc/watermark.png');

// Combinde watermark image with image already generated in $dst
imagecopy($dst, $watermark, $tnWidth-$mwidth-5, $tnHeight-$mheight-5, 0, 0, $mwidth, $mheight);

Решение состоит в том, чтобы добавить:

imagealphablending($dst, true);
imagesavealpha($dst, true);

Полный код:

// Watermark
$watermark = imagecreatefrompng($docRoot . '/images/misc/watermark.png');
list($mwidth, $mheight) = getimagesize($docRoot . '/images/misc/watermark.png');

imagealphablending($dst, true);
imagesavealpha($dst, true);

// Combinde watermark image with image already generated in $dst
imagecopy($dst, $watermark, $tnWidth-$mwidth-5, $tnHeight-$mheight-5, 0, 0, $mwidth,

Ответы [ 3 ]

0 голосов
/ 11 ноября 2010

Сохранить $dst с альфа-каналом, а не $watermark.

// Watermark
$watermark = imagecreatefrompng($docRoot . '/images/misc/watermark.png');
list($mwidth, $mheight) = getimagesize($docRoot . '/images/misc/watermark.png');

imagealphablending($dst, false);
imagesavealpha($dst, true);

// Combinde watermark image with image already generated in $dst
imagecopy($dst, $watermark, $tnWidth-$mwidth-5, $tnHeight-$mheight-5, 0, 0, $mwidth, $mheight);
0 голосов
/ 02 сентября 2011

У меня была та же проблема, но для того, чтобы она заработала, я закомментировал эти две строки из своего кода:

imagesavealpha($image_1, true);
imagesavealpha($image_2, true);

, поэтому мой код выглядел так:

$image_1 = imagecreatefrompng("example26_".$acct.".png");
$image_2 = imagecreatefrompng('example27.png');
imagealphablending($image_1, true);
imagealphablending($image_2, true);
//imagesavealpha($image_1, true);
//imagesavealpha($image_2, true);
imagecopy($image_1, $image_2, 0, 0, 0, 0, 1350, 250);
header("Content-Type: image/png");
imagepng($image_1);

теперь два изображения объединились и сохранили прозрачность, с этими двумя линиями он генерировал случайный белый фон, надеюсь, это поможет другим с той же проблемой

0 голосов
/ 11 ноября 2010

Попробуйте imagecopymerge вместо imagecopy

РЕДАКТИРОВАТЬ: попробуйте этот код:

header('Content-type: image/jpeg');
$dst = imagecreatefromjpeg($image_path);
$watermark = imagecreatefrompng($docRoot . '/images/misc/watermark.png');
list($mwidth, $mheight) = getimagesize($docRoot . '/images/misc/watermark.png');
imagecopymerge($dst, $watermark, $tnWidth-$mwidth-5, $tnHeight-$mheight-5, 0, 0, $mwidth, $mheight, 100);
imagejpeg($dst,'',90);
imagedestroy($dst);
...