2012-05-21 5 views
12

GIF가 투명하게 (부분적으로) 투명하게 표시되는지 확인하려면 어떻게해야합니까?Python에서 GIF 투명 여부 확인

PIL로 이미지를 열고 이미지의 모드를 확인하여 PNG로이를 수행했습니다. 그러나 GIF는 상관없이 같은 모드입니다.

오탐 (false positives)에 관해서는 완전히 불투명 한 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 

투명성은 GIF와 함께 작동하는 방법에 대한 here보기 (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 실제로 알파 채널을 사용하는지 여부를 확인하기 위해 비슷한 방법을 사용할 수 있습니다.