如何检查GIF是否透明(甚至部分)?
我通过用PIL打开图像并检查图像的模式,完成了PNG.但是,GIF具有相同的模式.
对于假阳性,我不介意如果一个完全不透明的GIF被标记为透明(假设这是一个罕见的情况),但我确实知道透明GIF被标记为不透明.
对于图书馆,我更喜欢使用PIL而不是其他东西的解决方案,但无论如何.
解决方法
@H_403_11@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通道,将其粘贴到白色和黑色背景上并比较结果.