确定 GIF 在 Python 中是不是透明

Posted

技术标签:

【中文标题】确定 GIF 在 Python 中是不是透明【英文标题】:Determining if a GIF is transparent in Python确定 GIF 在 Python 中是否透明 【发布时间】:2012-05-28 04:55:19 【问题描述】:

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

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

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

至于库,我更喜欢使用 PIL 的解决方案,而不是其他东西,但不管用什么都行。

【问题讨论】:

对于 8 位 PNG,我敢打赌您当前的方法不起作用,它会一直返回模式 'P'。在这种情况下,您需要将其视为 GIF。 【参考方案1】:
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())
    return False

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

【讨论】:

以上是关于确定 GIF 在 Python 中是不是透明的主要内容,如果未能解决你的问题,请参考以下文章

如何用PIL确定ICO图像的透明色指数?

Python中使用tkinter创建透明图层不规则组件插入GIF动图等功能实现

Gif 图像格式中如何合并透明度

如何使用 PIL(python 成像)创建透明 gif(或 png)

GIF录制python使用tkinter实现透明窗体实现实用的GIF录屏功能(第六篇)

确定 Python 是不是在 virtualenv 中运行