确定GIF在Python中是否透明

时间:2012-05-21 17:09:53

标签: python image python-imaging-library gif

我如何检查GIF是否透明(甚至部分)?

我通过使用PIL打开图像并检查图像的模式来完成PNG。但无论如何,GIF都有相同的模式。

至于误报,我不介意一个完全不透明的GIF被标记为透明(假设这是一种罕见的情况),但我很清楚透明GIF是否被标记为不透明。

至于图书馆,我更喜欢使用PIL而不是其他东西的解决方案,但无论如何都有效。

1 个答案:

答案 0 :(得分:20)

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

请参阅here了解透明度如何与GIF(以及8位,调色板,PNG)配合使用。

请注意,您的误报 是可能的:GIF可以将颜色定义为透明但不使用它。我想这可能是非常罕见的 - 为什么要抛弃一种颜色以获得透明度而不使用它? (你的假阴性是不可能的。)

但是,如果你需要知道是否实际使用了透明度,你可以制作两个版本的图像,其中透明颜色被映射到不同的颜色(比如黑色和白色),然后比较它们。如果存在任何差异,则图像确实使用透明度。像这样:

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())

您可以使用类似的方法来查看24位PNG是否实际使用Alpha通道,将其粘贴到白色和黑色背景上并比较结果。