GD: Сделать белый фон для PNG прозрачным

У меня есть изображение водяного знака 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,

person Cudos    schedule 11.11.2010    source источник


Ответы (3)


Сохраните $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);
person Mike C    schedule 11.11.2010
comment
Просто добавьте imagealphablending($dst, true); imagesavealpha($dst, правда); сделал трюк. Спасибо, что поставили меня на путь. - person Cudos; 12.11.2010

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

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);

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

person artfulhacker    schedule 02.09.2011

Попробуйте 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);
person likebeats    schedule 11.11.2010