2012-05-21 34 views
12

Làm cách nào để kiểm tra xem GIF có trong suốt (thậm chí một phần) không?Xác định xem GIF có minh bạch trong Python

Tôi đã thực hiện điều này bằng PNG bằng cách mở hình ảnh bằng PIL và kiểm tra chế độ của hình ảnh. Nhưng GIF có cùng chế độ bất kể. Đối với dương tính giả tôi không nhớ nếu một GIF hoàn toàn mờ đục được gắn cờ là minh bạch (giả sử đây là một trường hợp hiếm hoi), nhưng tôi nhớ nếu một GIF trong suốt bị gắn cờ là mờ đục.

Đối với thư viện, tôi thích một giải pháp sử dụng PIL hơn là cái gì khác, nhưng bất kỳ công trình nào.

+1

Đối với PNG 8 bit, tôi đặt cược phương thức hiện tại của bạn không hoạt động, nó sẽ trả về chế độ '' P'' mọi lúc. Bạn sẽ cần phải xử lý nó tương tự như một GIF trong trường hợp đó. –

Trả lời

17
img = Image.open(filename) 
if img.mode == "RGBA" or "transparency" in img.info: 
    # image uses transparency 

Xem here để biết độ trong suốt hoạt động với GIF (và 8 bit, palettized, PNG).

Lưu ý rằng trường hợp dương tính giả của bạn có thể: GIF có thể xác định màu là minh bạch nhưng không sử dụng màu đó. Tôi tưởng tượng điều này sẽ là khá hiếm, mặc dù - tại sao ném một màu đi cho minh bạch và không sử dụng nó? (Âm tính giả của bạn là không thể.)

Tuy nhiên, nếu bạn cần biết tính trong suốt có thực sự được sử dụng hay không, bạn có thể tạo hai phiên bản của hình ảnh trong đó màu trong suốt được ánh xạ tới các màu khác nhau.) và sau đó so sánh chúng. Nếu có bất kỳ sự khác biệt nào, hình ảnh sẽ sử dụng độ trong suốt. Cũng giống như vậy:

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()) 

Bạn có thể sử dụng một cách tiếp cận tương tự để xem liệu một PNG 24 bit thực sự sử dụng kênh alpha, bằng cách dán nó lên nền màu trắng và màu đen và so sánh kết quả.

Các vấn đề liên quan