2012-05-21 90 views
12

如何檢查GIF是否透明(即使部分)?確定GIF在Python中是否透明

我用PNG打開圖像並檢查圖像的模式來完成此操作。但是無論GIF都有相同的模式。

至於誤報,我不介意一個完全不透明的GIF被標記爲透明(假設這是一種罕見的情況),但我不介意透明GIF被標記爲不透明。

至於圖書館,我更喜歡使用PIL而不是別的東西的解決方案,但無論什麼作品。

+1

對於8位PNG,我敢打賭你目前的方法不起作用,它會一直返回模式'P'。在這種情況下,您需要將其視爲與GIF類似。 –

回答

17
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通道,將其粘貼到白色和黑色的背景和比較結果。