请不要发布您未经过实际测试的代码! 我花了一些时间寻找这个答案。 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是无能为力的,有点像火鸡,但是你们中的一些人比我更先进,并且可能知道这种或那种方式的明确答案......
提前感谢您的帮助。
答案 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');
?>