2012-04-27 47 views
4

我想通過php Object Imagick將PNG32轉換爲PNG8。 但我用setImageDepth和setImageFormat將參數設置爲8bit,但沒有生效。 這樣的代碼:如何通過PHP中的Imagick將PNG32轉換爲PNG8

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

inputfile中是PNG32,但上述輸出保持PNG8,具有其它溶液?

回答

9

這似乎是一個已知的問題,所以我做了一些研究。基本上,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'); 

出來不錯。

+0

+1你是一個救星。 – 2013-10-01 01:52:20

+0

確實是救命恩人。我正要寫一個自己的問題,關於1位B/W圖像轉換爲縮小的灰度圖像,然後讓它工作一整天。在另一臺(較舊的)服務器上運行良好的代碼。感謝Greg! guantizeImage()需要在加載圖像後完成(顯然)。 – MattBianco 2014-01-27 14:02:03

+0

需要透明背景或白色背景如何操作? – 2014-04-17 09:22:57

1

我知道這是一個已經被回答的老問題,但是我發現有一個更簡單的方法可以做到這一點。您可以通過在文件名前添加格式來強制寫入格式(例如png8:outputfile.png)。這個問題的例子可以這樣完成:

$im = new Imagick($image); 
$im->cropImage($cutWidth,$cutHeight,$x,$y); 
$im->thumbnailImage($maxWidth, $maxHeight); 
$im->writeImage("png8:$filename"); 
相關問題