14

GIFが(部分的にでも)透明であるかどうかを確認するにはどうすればよいですか?

PILで画像を開き、画像のモードを確認することで、PNGを使用してこれを実現しました。ただし、GIFのモードは関係ありません。

誤検知については、完全に不透明なGIFに透明のフラグが付けられてもかまいませんが(これはまれなケースであると想定しています)、透明のGIFに不透明のフラグが付けられてもかまいません。

ライブラリに関しては、他のものよりもPILを使用するソリューションを好みますが、機能するものは何でもかまいません。

4

1 に答える 1

21
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 が実際にアルファ チャネルを使用しているかどうかを確認できます。それには、白と黒の背景に貼り付けて結果を比較します。

于 2012-05-21T17:16:21.030 に答える