2012-05-21 17 views
12

में पारदर्शी है या नहीं, मैं यह जांचने के लिए कैसे जाऊंगा कि कोई जीआईएफ पारदर्शी है (आंशिक रूप से)?यह निर्धारित करना कि क्या एक जीआईएफ पाइथन

मैंने पीआईएल के साथ छवि को खोलकर और छवि के मोड की जांच करके पीएनजी के साथ इसे पूरा किया। लेकिन जीआईएफ के पास एक ही मोड है।

झूठी सकारात्मकताओं के लिए मुझे कोई फर्क नहीं पड़ता कि अगर पूरी तरह से अपारदर्शी जीआईएफ पारदर्शी के रूप में ध्वजांकित हो जाता है (मान लीजिए कि यह एक दुर्लभ मामला है), लेकिन मुझे लगता है कि एक पारदर्शी जीआईएफ अपारदर्शी होने के रूप में ध्वजांकित हो जाता है।

पुस्तकालयों के लिए, मैं एक ऐसा समाधान पसंद करूंगा जो पीआईएल का उपयोग किसी और चीज के बजाय करता है, लेकिन जो भी काम करता है।

+1

एक 8-बिट पीएनजी के लिए मैं शर्त लगाऊंगा कि आपकी वर्तमान विधि काम नहीं करती है, यह हर समय मोड 'पी' वापस कर देगी। आपको उस मामले में एक जीआईएफ के समान व्यवहार करने की आवश्यकता होगी। –

उत्तर

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

कैसे पारदर्शिता GIF साथ काम करता है के लिए here देखें (और 8 बिट, palettized, PNG का)।

ध्यान दें कि आपका झूठा सकारात्मक मामला संभव है: एक जीआईएफ एक रंग को पारदर्शी के रूप में परिभाषित कर सकता है लेकिन इसका उपयोग नहीं कर सकता है। मुझे लगता है कि यह काफी दुर्लभ होगा, हालांकि - पारदर्शिता के लिए रंग क्यों फेंक दें और इसका उपयोग न करें? (आपका झूठा नकारात्मक संभव नहीं है।)

फिर भी, अगर आपको पता होना चाहिए कि पारदर्शिता वास्तव में उपयोग की जाती है, तो आप छवि के दो संस्करण बना सकते हैं जिसमें पारदर्शी रंग विभिन्न रंगों में मैप किया जाता है (कहें, काला और सफेद) और फिर उनकी तुलना करें। यदि कोई अंतर है, तो छवि पारदर्शिता का उपयोग करती है। इसलिए जैसा:

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 वास्तव में अल्फ़ा चैनल का उपयोग करता है को देखने के लिए, सफेद और काले रंग की पृष्ठभूमि पर चिपकाकर और परिणामों की तुलना द्वारा एक समान दृष्टिकोण इस्तेमाल कर सकते हैं।

संबंधित मुद्दे