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.
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. –