2012-05-21 20 views
12

¿Qué debo hacer para verificar si un GIF es transparente (incluso parcialmente)?Determinar si un GIF es transparente en Python

Lo logré con PNG abriendo la imagen con PIL y comprobando el modo de la imagen. Pero los GIF tienen el mismo modo independientemente.

En cuanto a los falsos positivos no me importa si un GIF completamente opaco se marca como transparente (suponiendo que sea un caso raro), pero me importa si un GIF transparente se marca como opaco.

En cuanto a las bibliotecas, preferiría una solución que use PIL en lugar de otra cosa, pero funcione lo que sea.

+1

Para un PNG de 8 bits apostaría que su método actual no funciona, volverá al modo '' P'' todo el tiempo. Tendrá que tratarlo de manera similar a un GIF en ese caso. –

Respuesta

17
img = Image.open(filename) 
if img.mode == "RGBA" or "transparency" in img.info: 
    # image uses transparency 

Ver here de cómo trabaja con transparencia GIF (y de 8 bits, de paleta, PNG).

Tenga en cuenta que su caso de falso positivo es posible: un GIF podría definir un color como transparente pero no usarlo. Me imagino que esto sería bastante raro, sin embargo, ¿por qué tirar un color de distancia para la transparencia y no usarlo? (Su falso negativo no es posible.)

Aún así, si necesita saber si realmente se usa la transparencia, puede hacer dos versiones de la imagen en la que el color transparente se asigna a diferentes colores (por ejemplo, blanco y negro) y luego compararlos. Si hay alguna diferencia, la imagen usa transparencia. De este modo:

def uses_transparency(filename): 
    img = Image.open(filename) 
    trans = img.info.get("transparency", None) 
    if trans is not None: 
     trans *= 3 # convert color number to palette table index 
     palette = img.getpalette() 
     imgs = [] 
     for bg in [0, 255]: # map transparent color first to black, then white 
      palette[trans:trans+3] = [bg] * 3 
      img.putpalette(palette) 
      imgs.append(img.convert("L")) 
     return bool(ImageChops.difference(*imgs).getbbox()) 

Se puede usar un enfoque similar para ver si un PNG de 24 bits realmente utiliza el canal alfa, pegándola en fondos blancos y negros y comparar los resultados.

Cuestiones relacionadas