2010-01-13 14 views
7

Parece que PHP y GD tienen problemas para crear imágenes de PNG de tipo escala de grises con alfa cuando se usa imagecreatefrompng(). Los resultados están increíblemente distorsionados.¿Cómo comprobar un PNG para el tipo de color de escala de grises/alfa?

Me preguntaba si alguien sabía de una forma de probar el tipo de color para notificar al usuario de la incompatibilidad?

Ejemplo:

imagen original: http://dl.dropbox.com/u/246391/Robin.png
imagen resultante: http://dl.dropbox.com/u/246391/Robin_result.png

Código:

<?php 

$resource = imagecreatefrompng('./Robin.png'); 
header('Content-type: image/png'); 
imagepng($resource); 
imagedestroy($resource); 

Cheers,

Aron

+0

¿Qué quiere decir by distortist? Hay ciertos pasos que debe seguir para preservar la transparencia alfa. Pero problemas de escala de grises ... eso es nuevo para mí –

+0

He actualizado mi ejemplo para incluir una imagen de ejemplo. Preservar la transparencia alfa está bien. Es específicamente imágenes en escala de grises con transparencia que GD no puede manejar, vea la respuesta de haim evgi a continuación. – ac94

Respuesta

8

El tipo de color de una imagen PNG se almacena en el desplazamiento de bytes en el archivo 25 (contando desde 0). Así que si usted puede conseguir el asimiento de los bytes del archivo PNG, sólo tiene que mirar en el byte 25 (No hago PHP, así que no sé cómo hacerlo):

  • 0 - escala de grises
  • 2 - RGB
  • 3 - RGB con la paleta
  • 4 - escala de grises + alfa
  • 6 - RGB + alfa

el byte anterior (offset 24) da el número de bits por canal. Ver the PNG spec para más detalles.

Con un ligero giro, un archivo PNG puede tener "alfa 1 bit" (como GIF) al tener un fragmento tRNS (cuando es del tipo de color 0 2 o 3).

+0

¡Eso es perfecto, gracias! – ac94

0

vea esta respuesta :

Otra nota útil para quienes usan ImageCreateFromPng: PHP y GD no reconocen las imágenes en escala de grises/alfa.

Si utiliza imágenes en escala de grises con transparencia entre 0% y 100%, guarde la imagen como RGB.

Al menos esto es cierto para PHP Version 4.4.2-1 y en 5.1.2-1 con imágenes creadas con GIMP 2.2.8.

url: http://php.net/manual/en/function.imagecreatefrompng.php

+0

Gracias, sin embargo, estoy buscando una manera de detectar que la imagen es en escala de grises con transparencia antes de tratar de crear el recurso con 'imagecreatefrompng()'. Las imágenes se envían al sitio, así que desafortunadamente no tengo forma de volver a guardar la imagen como RBG (al menos no conozco un método). – ac94

4

aterricé aquí hoy la búsqueda de una manera de saber (a través de php) si una imagen .png específica es un alfa-png uno -
respuesta apunta David Jones' a la dirección correcta, realmente fácil de implementar en php:

file_get_contents para cargar solo ese byte de 25 '(¡ahí está, de hecho!), Y
ord() para obtener su valor ASCII, para probarlo (contra el '6' en mi caso)

if(ord(file_get_contents($alpha_png_candidate, NULL, NULL, 25, 1)) == 6) { 
    is_alpha_png_so_do_something(); 
    } 

realmente lo necesitaba para asegurar la compatibilidad con IE6 dentro cms fácil -generated páginas, para reemplazar a todos los alfa-png < img> etiquetas con inline-block < vanos> - el archivo de alfa-png a continuación, se desempeñó como variable para la propiedad CSS ms-propietaria filtro

.alpha_png_span{ 
    filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(
    src='$alpha_png_candidate', sizingMethod='crop') 
    } 

... y todo funciona, ¡así que gracias!

paolo

+0

Usando '(bool) (ord (file_get_contents ($ alpha_png_candidate, NULL, NULL, 25, 1)) & 4)' en cambio le dirá si hay un canal alfa, independientemente de si la imagen es en escala de grises o rgb. – Walf

Cuestiones relacionadas