仅限PHP GD:PNG24 + Alpha => PNG8不保存Alpha

时间:2013-08-24 17:12:41

标签: php png alpha-transparency png-8

请不要发布您未经过实际测试的代码! 我花了一些时间寻找这个答案。 StackOverflow上有几个类似的帖子,但我发现的任何内容都不会产生这个看似简单的结果。

pngquant对于某些用途非常好用,但在这种情况下,我有一个特定用途,我试图填写,这意味着只使用通用PHP和GD安装

现在完整的相关代码!这个简单的代码,产生一个高颜色的PNG图像,具有半透明的alpha通道。效果很好,简单而有效!

<?php
$img = imagecreatetruecolor(50, 50);
imagesavealpha($img, true);
$color = imagecolorallocatealpha($img, 65, 65, 65, 20);
imagefill($img, 0, 0, $color);

header('content-type: image/png');
imagepng($img, 'test.png');
imagedestroy($img);

print file_get_contents('test.png');
?>

以下几乎完全相同的代码会产生8位PNG图像文件,遗憾的是,Alpha通道数据会丢失。

<?php
$img = imagecreatetruecolor(50, 50);
imagesavealpha($img, true);
$color = imagecolorallocatealpha($img, 65, 65, 65, 20);
imagefill($img, 0, 0, $color);
imagetruecolortopalette($img, false, 255); #this line missing in sample above
header('content-type: image/png');
imagepng($img, 'test.png');
imagedestroy($img);

print file_get_contents('test.png');
?>

知道具有alpha通道的8位PNG是否可行,PHP GD可以做到吗?看起来PHP GD是无能为力的,有点像火鸡,但是你们中的一些人比我更先进,并且可能知道这种或那种方式的明确答案......

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我认为你应该在完成调色板转换后调用imagesavealpha,所以新的/转换的调色板是&#34;适应&#34;与alpha值。这应该有效:

<?php
$img = imagecreatetruecolor(50, 50);

$color = imagecolorallocatealpha($img, 65, 65, 65, 20);
imagefill($img, 0, 0, $color);
imagetruecolortopalette($img, false, 255);

imagesavealpha($img, true);

header('content-type: image/png');
imagepng($img, 'test.png');
imagedestroy($img);

print file_get_contents('test.png');
?>