2012-09-17 24 views
5

我需要在PHP中創建一個灰度圖像。我不是在討論調色板中帶有灰度值的索引圖像,而是關於一個真實的灰度圖像。所不同的是在PNG(彩色型)的第26個字節:在PHP中創建一個真正的灰度PNG

我試圖imagefilter($im, IMG_FILTER_GRAYSCALE);以及imagetruecolortopalette($im, false, 255);

0 - greyscale <-- THIS IS WHAT I NEED 
2 - RGB 
3 - RGB with palette 
4 - greyscale + alpha 
6 - RGB + alpha 

(詳見How to check a PNG for grayscale/alpha color type?),但我得到的要麼是RGB灰度圖像(色類型2)或具有灰度調色板的RGB調色板圖像(顏色類型3)。我也嘗試用imagecreate()而不是imagecreatetruecolor()來初始化圖像,但是這隻會導致調色板圖像。

有什麼辦法用PHP的GD函數(或PHP中的任何其他函數)創建顏色類型爲0的灰度PNG?

這裏是一些不同的灰度圖像樣本,以顯示我的意思。它們看起來都一樣,但如果在PhotoShop中打開它們並查看圖像 - >模式設置,則會看到差異。也十六進制編輯器將揭示在第26字節的區別:

RGB RGB,顏色類型2,3149個字節
RGB palette RGB調色板,顏色類型3,3971個字節
True Grayscale Image真灰度圖像,顏色類型0,1105個字節< - 這是我所需要的


UPDATE 01:

這是我用來創建PNG的基本代碼。評論行是我嘗試過的替代方案:

//$im = imagecreate($image_size, $image_size); 
$im = imagecreatetruecolor($image_size, $image_size); 

//imagefilter($im, IMG_FILTER_GRAYSCALE); 
//imagetruecolortopalette($im, false, 255); 

imagepng($im, $imgPathName); 
imagedestroy($im); 
+0

你的代碼看起來如何? – Breezer

+0

@Breezer:請參閱我的OP中的「更新01」。 – Jpsy

+0

我在猜你在找http://php.net/manual/en/function.imagecolorallocate.php 我認爲這個教程會幫助你,http://php.about.com/od /gdlibrary/ss/grayscale_gd.htm – Breezer

回答

5

GD庫不支持轉換爲「true」灰度。它只支持RGB和TrueColor *。

有什麼辦法用PHP的GD函數(或PHP中的任何其他函數)創建顏色類型爲0的灰度PNG?

ImageMagick是你在找什麼。

$im = new Imagick(); 
$im->readImage('file.png'); 
$im->setImageType(Imagick::IMGTYPE_GRAYSCALE); 
$im->writeImage('file.gray.png'); 
+0

你有參考嗎? – Xeoncross

+0

@Xeoncross源碼https://bitbucket.org/pierrejoye/gd-libgd/src - 僅支持RGB和TrueColor *輸出。 – h0tw1r3

+0

@ h0tw1r3:就是這樣 - 謝謝!作爲一個方面說明:只要我有權訪問目標機器上的GraphicsMagick,我發誓永遠不會再使用ImageMagick。幸運的是,如果您用''Gmagick''替換'Imagick'(並安裝GraphicsMagick PHP擴展),h0tw1r3的代碼將與GM完美協作。 – Jpsy