我将如何检查 GIF 是否透明(甚至是部分透明)?
我通过使用 PIL 打开图像并检查图像的模式来使用 PNG 完成此操作。但无论如何,GIF 都具有相同的模式。
至于误报,我不介意完全不透明的 GIF 是否被标记为透明(假设这是一种罕见的情况),但我确实介意透明的 GIF 是否被标记为不透明。
至于图书馆,我更喜欢使用 PIL 而不是其他东西的解决方案,但无论如何都可以。
我将如何检查 GIF 是否透明(甚至是部分透明)?
我通过使用 PIL 打开图像并检查图像的模式来使用 PNG 完成此操作。但无论如何,GIF 都具有相同的模式。
至于误报,我不介意完全不透明的 GIF 是否被标记为透明(假设这是一种罕见的情况),但我确实介意透明的 GIF 是否被标记为不透明。
至于图书馆,我更喜欢使用 PIL 而不是其他东西的解决方案,但无论如何都可以。
img = Image.open(filename)
if img.mode == "RGBA" or "transparency" in img.info:
# image uses transparency
请参阅此处了解透明度如何与 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 通道,方法是将其粘贴到白色和黑色背景上并比较结果。