2012-09-17 15 views
5

Potrzebuję utworzyć obraz w skali szarości w PHP. Nie mówię o indeksowanym obrazie z wartościami skali szarości w jego palecie, ale o PRAWDZIWYM obrazie w skali szarości. Różnica jest w 26 bajta PNG (typu kolor):Tworzenie prawdziwego PNG w skali szarości w PHP

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

(Zobacz How to check a PNG for grayscale/alpha color type? dla szczegółów)

próbowałem imagefilter($im, IMG_FILTER_GRAYSCALE); jak imagetruecolortopalette($im, false, 255); ale otrzymuję są albo RGB obrazy w skali szarości (kolor typ 2) lub obrazy palety RGB z paletą skali szarości (typ koloru 3). Próbowałem również zainicjować obraz z imagecreate() zamiast imagecreatetruecolor(), ale znowu prowadzi to tylko do obrazu palety.

Czy istnieje sposób na utworzenie skali szarości w formacie PNG z funkcjami GD PHP (lub dowolnymi innymi funkcjami w PHP)?

Oto niektóre przykłady różnych obrazów w skali szarości, aby pokazać, co mam na myśli. Wszystkie wyglądają tak samo, ale jeśli otworzysz je w PhotoShop i spojrzysz na ustawienie Image -> Mode, zobaczysz różnicę. Również edytor hex pokaże różnicę w 26 bajt:

RGB RGB, kolor typ 2, 3149 bajtów
RGB palette palety RGB, kolor typ 3, 3971 bajtów
True Grayscale Image Prawdziwy obraz w skali szarości, kolor typ 0, 1105 bajtów < - to co muszę


UPDATE 01:

Oto podstawowy kod, którego używam do tworzenia plików PNG. Skomentowane linie to alternatywy, które próbowałem:

//$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

Jak wygląda twój kod? – Breezer

+0

@ Breezer: Zobacz "UPDATE 01" w moim OP. – Jpsy

+0

Zgaduję, że szukasz http://php.net/manual/en/function.imagecolorallocate.php Myślę, że ten samouczek pomoże ci po drodze, http://php.about.com/od /gdlibrary/ss/grayscale_gd.htm – Breezer

Odpowiedz

5

Biblioteka GD nie obsługuje konwersji do "prawdziwej" skali szarości. Obsługuje tylko RGB i TrueColor *.

Czy istnieje sposób na utworzenie skali szarości w formacie PNG z funkcjami GD PHP (lub dowolnymi innymi funkcjami w PHP)?

ImageMagick jest tym, czego szukasz.

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

Czy masz referencje? – Xeoncross

+0

@Xeoncross ze źródła https://bitbucket.org/pierrejoye/gd-libgd/src - obsługuje tylko dane wyjściowe RGB i TrueColor *. – h0tw1r3

+0

@ h0tw1r3: To wszystko - dziękuję! Na marginesie: przysiągłem, że nigdy nie będę używał ImageMagick, dopóki będę mieć dostęp do GraphicsMagick na maszynie docelowej. Na szczęście kod h0tw1r3 będzie działał idealnie z GM, jeśli zamienisz '' Imagick'' na '' Gmagick'' (i zainstalujesz rozszerzenie PHP GraphicsMagick). – Jpsy

Powiązane problemy