开发者

Merging multiple transparent PNGs into one

I am framing ads with a curved border.

Here is a sample ad: http://imageshack.us/f/20/4e5f5fe94b327new60seciq.png/

I am trying to replicate what would be done in Photoshop, pl开发者_JS百科ace one on top of the other. Here is the code I'm using:

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

What is happening is that the last copy to take place (the frame) is taking priority and instead of seeing the ad, im getting a transparent block. Here is a blown up image of what GD is doing:

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

I'm hoping there is a simple solution to get the lower layer to remain visible - if not I think I will have to write a function and go pixel by pixel and compare...

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


Set imagealphablending to true. From the manual, emphasis added:

In blending mode, the alpha channel component of the color supplied to all drawing function, such as imagesetpixel() determines how much of the underlying color should be allowed to shine through. As a result, gd automatically blends the existing color at that point with the drawing color, and stores the result in the image. The resulting pixel is opaque. In non-blending mode, the drawing color is copied literally with its alpha channel information, replacing the destination pixel. Blending mode is not available when drawing on palette images.

Also, you are not actually coloring the background transparent. You are just telling that $black is transparent. Instead, use imagefill with imagecolorallocatealpha:

imagefill($dest_img, 0, 0, imagecolorallocatealpha($dest_img, 0, 0, 0, 127));
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜