我正在构建带有弯曲边框的广告。
以下是广告示例: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;
}
答案 0 :(得分:0)
将imagealphablending
设为true。从手册中,强调增加了:
在混合模式下,提供给所有绘图功能的颜色的alpha通道组件(例如imagesetpixel())决定了应该允许多少底层颜色透过。因此,gd会自动将该点的现有颜色与绘图颜色混合,并将结果存储在图像中。结果像素是不透明的。 在非混合模式下,绘图颜色将使用其Alpha通道信息进行字面复制,替换目标像素。在调色板图像上绘制时,无法使用混合模式。
此外,您实际上并没有将背景着色透明。您只是说$black
是透明的。相反,请将imagefill
与imagecolorallocatealpha
:
imagefill($dest_img, 0, 0, imagecolorallocatealpha($dest_img, 0, 0, 0, 127));