img = Image.open(filename)
if img.mode == "RGBA" or "transparency" in img.info:
# image uses transparency
透明度が GIF (および 8 ビットのパレット化された PNG) でどのように機能するかについては、こちらを参照してください。
誤検知の可能性があることに注意してください。GIFは色を透明として定義できますが、使用しません。ただし、これは非常にまれなことだと思います-透明性のために色を捨てて、それを使用しないのはなぜですか? (あなたの偽陰性はあり得ません。)
それでも、透過性が実際に使用されているかどうかを知る必要がある場合は、透過色が異なる色 (たとえば、黒と白) にマッピングされた 2 つのバージョンの画像を作成して、それらを比較できます。違いがある場合、画像は透明度を使用します。そのようです:
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())
return False
同様の方法を使用して、24 ビット PNG が実際にアルファ チャネルを使用しているかどうかを確認できます。それには、白と黒の背景に貼り付けて結果を比較します。