2012-09-17 20 views
5

Necesito crear una imagen en escala de grises en PHP. No estoy hablando de una imagen indexada con valores de escala de grises en su paleta, sino de una imagen VERDADERA en escala de grises. La diferencia está en el byte 26 del (tipo de color) PNG:Crear un PNG verdadero en escala de grises en PHP

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

(Ver How to check a PNG for grayscale/alpha color type? para más detalles)

Probé imagefilter($im, IMG_FILTER_GRAYSCALE);, así como imagetruecolortopalette($im, false, 255); pero lo único que consigue son o bien RGB imágenes en escala de grises (color tipo 2) o imágenes de paleta RGB con una paleta de escala de grises (tipo de color 3). También traté de inicializar la imagen con imagecreate() en lugar de imagecreatetruecolor(), pero nuevamente esto solo conduce a una imagen de paleta.

¿Hay alguna manera de crear un tipo de color 0 PNG en escala de grises con las funciones GD de PHP (o cualquier otra función en PHP)?

Aquí hay algunas muestras de diferentes imágenes en escala de grises para mostrar lo que quiero decir. Todos tienen el mismo aspecto, pero si los abre en PhotoShop y mira la configuración Imagen -> Modo, verá la diferencia. También un editor hexadecimal revelará la diferencia en el byte 26:

RGB RGB, color de tipo 2, 3149 bytes
RGB palette gama de colores RGB, tipo 3, 3971 bytes imagen en escala de grises verdadera de color
True Grayscale Image, tipo de color 0, 1105 bytes < - esto es lo que necesito


ACTUALIZACIÓN 01:

Aquí está el código básico que utilizo para crear los PNG. Las líneas comentadas son alternativas que he probado:

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

¿cómo se ve el código hasta ahora? – Breezer

+0

@Breezer: consulte "ACTUALIZACIÓN 01" en mi OP. – Jpsy

+0

Supongo que estás buscando http://php.net/manual/en/function.imagecolorallocate.php Creo que este tutorial te ayudará en el camino, http://php.about.com/od /gdlibrary/ss/grayscale_gd.htm – Breezer

Respuesta

5

La biblioteca de GD no admite la conversión a una escala de grises "verdadera". Solo es compatible con RGB y TrueColor *.

¿Hay alguna manera de crear un tipo de color 0 PNG en escala de grises con las funciones GD de PHP (o cualquier otra función en PHP)?

ImageMagick es lo que estás buscando.

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

¿Tiene alguna referencia? – Xeoncross

+0

@ Xeoncross desde la fuente https://bitbucket.org/pierrejoye/gd-libgd/src - solo admite salida RGB y TrueColor *. – h0tw1r3

+0

@ h0tw1r3: Eso es todo, ¡gracias! Como nota al margen: he jurado no volver a utilizar ImageMagick siempre que tenga acceso a GraphicsMagick en la máquina de destino. Afortunadamente, el código de h0tw1r3 funcionará perfectamente con GM, si reemplaza '' Imagick'' por '' Gmagick'' (e instala la extensión PHP de GraphicsMagick). – Jpsy

Cuestiones relacionadas