创建具有动态尺寸的透明gif / png

时间:2015-10-09 10:27:02

标签: php image-processing gd

尝试使用用户定义的维度创建gif或png。我最接近的是:

$imgWidth = intval($_GET['x']);
$imgWidth = $imgWidth > 0 ? $imgWidth : 1;

$imgHeight = intval($_GET['y']);
$imgHeight = $imgHeight > 0 ? $imgHeight : 1;

$im = imagecreatetruecolor($imgWidth, $imgHeight);
$white = imagecolorallocate($im, 0, 0, 0);

imagecolortransparent($im, $white);

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

这个出现可以正常工作,但经过仔细检查,它实际上会创建一个具有正确尺寸但前景为0 x 0px的图像。这导致图像在某些客户端中显示不正确,例如我在Photoshop中出现内存错误。我可以在Fireworks中打开它,但它在透明背景前面的最左上方显示零像素位图: enter image description here

我尝试在imagefilledrectangle($im, 0, 0, $imgWidth, $imgHeight, $white);之后直接添加imagecolortransparent($im, $white);,但它没有效果。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

这似乎是您提到的Adobe应用程序的特性。我没有那些副本,所以我无法用它们进行测试,但我尝试过的其他所有应用程序都按预期呈现图像。

也许请尝试以下操作,看看结果图像是否更适合Adobe:

$imgWidth = intval($_GET['x']);
$imgWidth = $imgWidth > 0 ? $imgWidth : 1;

$imgHeight = intval($_GET['y']);
$imgHeight = $imgHeight > 0 ? $imgHeight : 1;

$im = imagecreatetruecolor($imgWidth, $imgHeight);
imagealphablending($im, false);
imagesavealpha($im, true);
$white = imagecolorallocatealpha($im, 255, 255, 255, 127); // fully transparent white.

imagefill($im, 0, 0, $white);

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

猜测,我会说问题出现是因为您将透明度设置为图像的属性而不是颜色的属性(或者,更确切地说,像素)。

前者通常用于基于调色板的图像(imagecreate),其中像素是完全不透明或完全透明的,否则不能出现在图像中。也就是说,如果图像认为红色(ff0000)完全透明,则所有红色像素将是透明的,颜色将根本不显示。

对于真彩色图像(imagecreatetruecolor),将透明度指定为像素属性的能力是一种更好的方法,因为它可以实现部分透明度。这意味着您可以为不同的像素使用具有不同透明度级别的相同颜色。

上面的脚本使用后一种方法。