如何使用PHP GD库将PNG转换为8位PNG

如何使用PHP GD库将PNG转换为8位PNG,php,png,gdlib,png-8,Php,Png,Gdlib,Png 8,我想写一个例程,将PNG图像路径作为参数,并将该图像转换为8位PNG图像。我需要使用PHP GD库来实现这一点 要将任何PNG图像转换为8位PNG,请使用此函数,我刚刚创建了 函数转换器PNGTO8BITPNG() 参数 $sourcePath-源PNG文件的路径 $destPath-目标PNG文件的路径 注 我建议在运行此代码之前,确保$sourcePath存在并且$destPath可写。也许这个函数对一些透明图像不起作用 用法 示例(原始->8位) (来源:pfc.png)原始png图像

我想写一个例程,将PNG图像路径作为参数,并将该图像转换为8位PNG图像。我需要使用PHP GD库来实现这一点

要将任何PNG图像转换为8位PNG,请使用此函数,我刚刚创建了

函数转换器PNGTO8BITPNG() 参数
  • $sourcePath-源PNG文件的路径
  • $destPath-目标PNG文件的路径
注 我建议在运行此代码之前,确保
$sourcePath
存在并且
$destPath
可写。也许这个函数对一些透明图像不起作用

用法 示例(原始->8位) (来源:pfc.png)原始png图像

(目的地:pfc8bit.png)转换的png图像(8位)


希望有人觉得这有帮助。

我强烈建议使用命令行使用
exec()
popen()

GD库的调色板生成代码质量很差

与另一个答案中的图像相同,文件大小与GD库相同,但使用
pngquant
转换为仅100种颜色(甚至不是256种):


pngquant非常支持alpha透明度。

您的问题是什么?很高兴你告诉我们你一天的待办事项列表,但这并不是一个问题。ImageMagick会是一个更好的选择。@Znarkus我不确定这在GD中是否可行,但@Wh1T3h4Ck5证明我错了。@Nilesh,我刚刚尝试了一些透明PNG,它能工作吗?给我一个你们使用的透明PNG的链接。我使用的图片是:@Nilesh,是的,你们是对的。。。我忘了设置透明颜色。上面的函数现在有了新的主体。。。再试一次。@Wh1T3h4Ck5,是的,它正在工作。但图像还不清楚。我尝试了一些其他的图片作为参考well@Nilesh,我对此进行了研究,发现8位PNG和GIF是一样的,因为它们都使用位透明度(没有alpha通道)。实际上,我已经找到了将任何PNG转换为GIF(透明,256色)的解决方案,但当我尝试将其转换为透明PNG时,它会转换为32位(我猜,因为大多数GD函数返回32位结果)。但后来我发现,即使“属性”窗口说我用这种方式创建的图像是32位PNG,Photoshop也能识别它们为PNG-8,这些图像的实际大小为8位PNG!?奇怪的行为。。。
 function convertPNGto8bitPNG ($sourcePath, $destPath) {

     $srcimage = imagecreatefrompng($sourcePath);
     list($width, $height) = getimagesize($sourcePath);

     $img = imagecreatetruecolor($width, $height);
     $bga = imagecolorallocatealpha($img, 0, 0, 0, 127);
     imagecolortransparent($img, $bga);
     imagefill($img, 0, 0, $bga);
     imagecopy($img, $srcimage, 0, 0, 0, 0, $width, $height);
     imagetruecolortopalette($img, false, 255);
     imagesavealpha($img, true);

     imagepng($img, $destPath);
     imagedestroy($img);

 }
convertPNGto8bitPNG ('pfc.png', 'pfc8bit.png');