4

PHPオブジェクト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 に答える