PHP+GD: imagecopymerge not retaining PNG transparencies

ぃ、小莉子 提交于 2019-11-27 18:44:06

问题


I have two PNG files, "red.png" and "blue.png"; they are both mostly transparent, but there is a few pixels of red or blue splotches in various places.

I want to make a PHP script that merges the two; it should be as simple as something like:

$original = getPNG('red.png');
$overlay = getPNG('blue.png');

imagecopymerge($original, $overlay, 0,0, 0,0, imagesx($original), imagesy($original),   100);
header('Content-Type: image/png');
imagepng($original);

When I run this script, all I get is the blue dots -- with the transparency lost. I saw that I should add these:

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

(on both the original and the overlay?) And that doesn't seem to help any.

I saw a few workarounds on PHP.net, something to the tune of:

$throwAway = imagecreatefrompng($filename);
imagealphablending($throwAway, false);
imagesavealpha($throwAway, true);
$dstImage = imagecreatetruecolor(imagesx($throwAway), imagesy($throwAway));
imagecopyresampled($dstImage, $throwAway,0,0,0,0, imagesx($throwAway),     imagesy($throwAway),          imagesx($throwAway), imagesy($throwAway));

, which should convert the PNG to a "truecolor" image and retain transparency. It does seem to do so, but now all I see is blue on a black background.

What do I do?!


回答1:


This works perfectly for me:

$img1 = imagecreatefrompng('red.png');
$img2 = imagecreatefrompng('blue.png');

$x1 = imagesx($img1);
$y1 = imagesy($img1);
$x2 = imagesx($img2);
$y2 = imagesy($img2);

imagecopyresampled(
    $img1, $img2,
    0, 0, 0, 0,
    $x1, $y1,
    $x2, $y2);

imagepng($img1, 'merged.png', 0);

PHP Version 5.3.2
GD Version 2.0
libPNG Version 1.2.42

Have you tried saving the image to a file and checking that?



来源:https://stackoverflow.com/questions/3355993/phpgd-imagecopymerge-not-retaining-png-transparencies

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!