使用GD和PHP合并图像

时间:2011-07-04 18:37:50

标签: php transparency gd opacity

我正在努力从另外两个创建一个PNG图像。

图像A和B具有相同的尺寸,它们都是200x400px。最终的图像一样。

我正在使用带有PHP的GD库。

所以我的想法是从我原来的PNG-8创建一个PNG-24,然后使用颜色透明度,最后将第二个图像复制到 这款新的PNG-24。无论如何,当从PNG-24转到PNG-8并且颜色透明时,问题出现在第一步:

这是为了获得原始的PNG-8及其尺寸:

$png8 = imagecreatefrompng($imageUrl);
$size = getimagesize($imageUrl);

现在我创建一个新的PNG并用绿色填充它的背景(图像中没有):

$png24 = imagecreatetruecolor($size[0], $size[1]);
$transparentIndex = imagecolorallocate($png24, 0x66, 0xff, 0x66);
imagefill($png24, 0, 0, $transparentIndex);

这是为了使绿色透明:

imagecolortransparent($png24, $transparentIndex);     

然后我将png8复制到PNG-24中:

imagecopy($png24, $png8, 0, 0, 0, 0, $size[0], $size[1]);

所以这就是问题:原始PNG-8看起来不错,但原始图像中的形状周围有绿色边框。真的难以解释。似乎绿色背景的某些部分留在剩余的PNG中。

我该怎么办?

提前致谢

最好的问候,

费尔南多

1 个答案:

答案 0 :(得分:1)

我之前有一些png透明度问题,并且能够用这种模式解决它们:

// allocate original image to copy stuff to
$img = imagecreatetruecolor(200, 100);

// create second image
$bg = imagecreatefrompng('bg.png');

// copy image onto it using imagecopyresampled
imagecopyresampled($img, $bg, 0, 0, 0, 0, 200, 100, 200, 100);
imagedestroy($bg);

// create third image
// do same routine
$fg = imagecreatefrompng('fg.png');
imagecopyresampled($img, $fg, 50, 50, 0, 0, 50, 50, 50, 50);
imagedestroy($fg);

// output image
imagepng($img);
imagedestroy($img);

我认为我和你的唯一区别是imagecopy()imagecopyresampled()。我似乎记得有这个问题,虽然它已经有一段时间了。你可以在这里看到我使用这种模式的图像示例:http://www.ipnow.org/images/1/bggrad/bg4/yes/TRANSIST.TTF/8B0000/custombrowserimage.jpg(我分配一个空白图像,复制背景图像,复制透明度的叠加层)