将多个透明PNG合并为一个

时间:2011-09-01 10:59:36

标签: php png transparency gd

我正在构建带有弯曲边框的广告。

以下是广告示例:http://imageshack.us/f/20/4e5f5fe94b327new60seciq.png/

我试图复制在Photoshop中完成的工作,将一个放在另一个上面。这是我正在使用的代码:

// create destination canvas
$dest_img = imagecreatetruecolor(176, 75);

// Make the background transparent
$black = imagecolorallocate($dest_img, 0, 0, 0);
imagecolortransparent($dest_img, $black);

imageAlphaBlending($dest_img, false);
imageSaveAlpha($dest_img, true);

// copy ad into destination
imagecopy($dest_img, $ad_image, 0, 0, 0, 0, 176, 75);

// copy frame onto first half of image
imagecopy($dest_img, $curve_image, 0, 0, 0, 0, 88, 75);

发生的事情是发生的最后一个副本(框架)优先,而不是看到广告,我得到一个透明的块。这是GD正在做的事情的一幅图像:

http://imageshack.us/f/684/unled1to.png/

我希望有一个简单的解决方案让下层保持可见 - 如果不是,我想我将不得不写一个函数并逐像素地进行比较......

if (bottom_px == trans && top_px == trans) {
    dest_px = trans;
}
else {
    dest_px = top_px;
}

1 个答案:

答案 0 :(得分:0)

imagealphablending设为true。从手册中,强调增加了:

  

在混合模式下,提供给所有绘图功能的颜色的alpha通道组件(例如imagesetpixel())决定了应该允许多少底层颜色透过。因此,gd会自动将该点的现有颜色与绘图颜色混合,并将结果存储在图像中。结果像素是不透明的。 在非混合模式下,绘图颜色将使用其Alpha通道信息进行字面复制,替换目标像素。在调色板图像上绘制时,无法使用混合模式。

此外,您实际上并没有将背景着色透明。您只是说$black是透明的。相反,请将imagefillimagecolorallocatealpha

一起使用
imagefill($dest_img, 0, 0, imagecolorallocatealpha($dest_img, 0, 0, 0, 127));