PHP/GD - 透明背景

18
我希望能够在PHP中结合GD完成以下操作。不幸的是,ImageMagick不是一个选项,但这似乎是如此常见的问题,肯定有解决方案,只是我找不到。我想创建一个带有透明背景的PNG图像。然后我想在上面画一个矩形,复制一张图片并添加一些文本。其中一种方法如下:
$image = ImageCreateTrueColor (800, 600);
imagecolortransparent ($image, 0); //0 is pure black, the default fill color
imagerectangle (...);
//code to copy an image
imagettftext ($image, ...);
imagepng ($image);

这很好用,但复制的图像可能有一部分是黑色的,或者文本可能是黑色的。这样也会变成透明的,而我不想要这样。
imagefill ($image, 0,0, 0x7FFF0000);
imagetransparent ($image, 0x7FFF0000);

上面的代码是我在网上找到的,它将图像中的红色填充,然后使红色变为透明。同样地,这会导致图像中所有的红色都变成透明。我可以选择一种不太可能出现的颜色,但我不能保证这一点。
我是否遗漏了什么?这能被修复吗? 感谢您的回复!
1个回答

35

imagecolortransparent 可能不适合您在合并图像时使用,因为单色透明度可能会导致效果不佳。

相反,可以尝试使用透明填充遮罩来实现:

<?php
$image = imagecreatetruecolor(100, 100);

// Transparent Background
imagealphablending($image, false);
$transparency = imagecolorallocatealpha($image, 0, 0, 0, 127);
imagefill($image, 0, 0, $transparency);
imagesavealpha($image, true);

// Drawing over
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 25, 25, 75, 75, $black);

header('Content-Type: image/png');
imagepng($image);

imagealphablending默认在真彩色图像上为true,因此这不会有任何不同的效果 :) 此外,imagecreatetruecolor创建黑色图像,这就是为什么第一段代码使用了imagecolortransparent(0); - Spinal
在这种情况下,我看不到你的问题。我通过在中心绘制一个黑色矩形进行了测试,并且在周围透明度方面运行良好。 - Rudi Visser
真的吗?那么我的设置可能有问题,因为如果我尝试以下代码,我会得到一个带有黑色边框的蓝色矩形!$image = imagecreatetruecolor (800,600); imagealphablending ($image, true); imagefilledrectangle ($image, 50,50, 750, 550, imagecolorallocate ($image, 0,0,128)); header ('Content-type: image/PNG'); imagepng ($image); - Spinal
@user2139592 实际上,不要太快得出那个结论,因为我正在尝试的服务器上有一个修改过的PHP/GD。现在我正在另一台服务器上尝试它。 - Rudi Visser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接