4

我想通过 php Object Imagick 将 PNG32 转换为 PNG8。但我使用 setImageDepth 和 setImageFormat 将参数设置为 8bit,它没有生效。像这样的代码:

$im = new Imagick($image);
$im->cropImage($cutWidth,$cutHeight,$x,$y);
$im->thumbnailImage($maxWidth, $maxHeight); 
$im->setImageDepth(8);
$im->setImageFormat('PNG8');
$im->writeImage($filename);

输入文件是PNG32,但上面的输出仍然是PNG8,还有其他解决方案吗?

4

2 回答 2

12

这似乎是一个已知问题,所以我做了一些研究。基本上, setImageDepth 是不够的。您需要量化图像。这是一个对我有用的测试脚本......

$im = new imagick('stupid.png'); //an image of mine
$im->setImageFormat('PNG8');
$colors = min(255, $im->getImageColors());
$im->quantizeImage($colors, Imagick::COLORSPACE_RGB, 0, false, false );
$im->setImageDepth(8 /* bits */);
$im->writeImage('stupid8.png');

出来很好。

于 2012-05-07T05:34:08.810 回答
3

我知道这是一个已经回答的老问题,但是我发现了另一种更短的方法来做到这一点。png8:outputfile.png您可以通过在文件名前加上格式(例如)来强制写入格式。问题示例可以这样完成:

$im = new Imagick($image);
$im->cropImage($cutWidth,$cutHeight,$x,$y);
$im->thumbnailImage($maxWidth, $maxHeight); 
$im->writeImage("png8:$filename");
于 2014-10-17T22:32:27.797 回答