2010-04-02 26 views
16

Estoy buscando una manera de determinar rápidamente si una imagen PNG tiene características transparentes. Es decir, si alguna parte de la imagen es translúcida o muestra el fondo de alguna manera. ¿Alguien sabe una forma simple de detectar esto?¿Detecta si un archivo de imagen PNG es una imagen transparente?

ACTUALIZACIÓN: OK, ¿hay alguna manera menos complicada de extraer la especificación PNG y el código de pirateo?

+1

¿Qué estás buscando exactamente? La presencia de un canal alfa? ¿La declaración de un color transparente en una paleta PNG de 8 bits? La presencia de píxeles totalmente transparentes? ¿Qué pasa con los píxeles semitransparentes y las entradas de paleta? –

+0

Estoy buscando determinar si algún aspecto de la imagen PNG hace que cualquier parte de la imagen sea translúcida y muestre el fondo de alguna manera. – kenny

Respuesta

16

¿Por qué no simplemente recorre todos los píxeles de la imagen y comprueba sus valores alfa?

bool ContainsTransparent(Bitmap image) 
    { 
     for (int y = 0; y < image.Height; ++y) 
     { 
      for (int x = 0; x < image.Width; ++x) 
      { 
       if (image.GetPixel(x, y).A != 255) 
       { 
        return true; 
       } 
      } 
     } 
     return false; 
    } 
+11

Tenga en cuenta que usar GetPixel es atrozmente lento. Debe usar el método Bitmap.LockBits para obtener un puntero a los datos de la imagen y usar un código inseguro para procesar la imagen. El método GetPixel bloqueará los bits de la imagen, obtendrá los datos del píxel, construirá una Estructura de color y luego desbloqueará los bits de la imagen cada vez que se llame, lo que requerirá órdenes de magnitud de más tiempo de procesamiento. – jrista

+0

Esperaba algo un poco más rápido que comprobar cada píxel. Pero es ciertamente más fácil que RTM. Tendré que decidir si tengo tiempo para ese control de fuerza bruta. Gracias. – kenny

+0

Sería más eficiente devolver verdadero desde dentro del ciclo, por lo tanto, salir inmediatamente si el primer píxel es transparente. –

4

Bueno, yo todavía no entiendo la pregunta por completo, pero si sólo quiere comprobar, si una imagen dada puede utilizar características de transparencia, se puede utilizar este código:

Image img = Image.FromFile ("...", true); 
if ((img.Flags & 0x2) != 0) 
{ 
} 

Aunque no le ayudará a determinar si un archivo png dado realmente utiliza características transparentes, indicará que tiene un tipo de color 4 o 6 (ambos soportan transparencia) según la especificación del archivo png.

+0

Gracias, pero esto no es útil para mí, ya que necesito saber si la imagen contenida es realmente translúcida, no si pudiera ser. La otra respuesta anterior funciona, pero esperaba algo más rápido, que claramente es ... – kenny

+1

Esto es bastante útil. Lo he usado en combinación con el código anterior, así que solo inspecciono los píxeles de las imágenes que admiten transparencia. –

+0

@apathetic PNG con color tipo 3 admite transparencias también a través de tRNS. – Kornel

1

Aquí hay un enfoque efectivo: Abra el PNG en binario. Busque el byte 26 (25 si cuenta desde cero). Evalúe el valor de byte del carácter: 2 o inferior => definitivamente opaco, 3 o superior => admite transparencia. De acuerdo con mis hallazgos, los archivos generados por Photoshop solo usan 3 o más cuando es necesario, lo que hace que sea una manera confiable de saber cuándo usarlos. Parece que casi todos los archivos tienen 2 para opaco y 6 para mezcla alfa. También puede considerar comprobar las cadenas PNG e IHDR que se encuentran en esa área general para engañar a su código.

+0

No parece haber una manera de hacer esto para las imágenes con paleta; tienen "3" allí incluso si el galimatías ve la imagen como puramente opaca. – Nyerguds

+0

Este método solo es afirmativo para la respuesta opaca. De lo contrario, debe verificar toda la imagen. En cuanto a los falsos positivos innecesarios, te sorprendería ver cuántos GIF tienen los bits transparentes sin razón. Recientemente codifiqué el reconocimiento de transparencia GIF en mi galería web para hacer que los efectos sean bonitos.Luego tuvo muchos falsos positivos causados ​​por un software estúpido que hizo esas imágenes. Acabo de editar los archivos en un editor hexadecimal (no quería recomprimir) y eso lo solucionó. – Zdenek

+0

Por cierto, reconsiderar el uso de PNG con paleta. Tienen un bajo rendimiento de compresión en modo indexado. – Zdenek

Cuestiones relacionadas