2012-02-03 11 views
6

को संरक्षित करते हैं, मुझे आश्चर्य है कि पीआईएल का उपयोग करके एनिमेटेड जीआईएफ छवि को स्केल करना संभव है या नहीं। यह सच है image.format == 'GIF' and image.seek(image.tell()+1) के लिए निम्न मूल्यांकन करता है:आप पीआईएल में एनिमेटेड जीआईएफ छवि को कैसे स्केल करते हैं और एनीमेशन

def scale(self, data, w, h, default_format = 'PNG'): 
    """ scale image (with material from ImageTag_Hotfix)""" 
    #make sure we have valid int's 
    size = int(w), int(h) 

    original_file=StringIO(data) 
    image = PIL.Image.open(original_file) 
    # consider image mode when scaling 
    # source images can be mode '1','L,','P','RGB(A)' 
    # convert to greyscale or RGBA before scaling 
    # preserve palletted mode (but not pallette) 
    # for palletted-only image formats, e.g. GIF 
    # PNG compression is OK for RGBA thumbnails 
    original_mode = image.mode 
    img_format = image.format and image.format or default_format 
    if original_mode == '1': 
     image = image.convert('L') 
    elif original_mode == 'P': 
     image = image.convert('RGBA') 
    image.thumbnail(size, self.pil_resize_algo) 
    # decided to only preserve palletted mode 
    # for GIF, could also use image.format in ('GIF','PNG') 
    if original_mode == 'P' and img_format == 'GIF': 
     image = image.convert('P') 
    thumbnail_file = StringIO() 
    # quality parameter doesn't affect lossless formats 
    image.save(thumbnail_file, img_format, quality=self.pil_quality) 
    thumbnail_file.seek(0) 
    return thumbnail_file, img_format.lower() 

मुझे पता है कि एक एनिमेटेड GIF पहचान करने के लिए: विशेष प्लोन के आद्यरूप में ImageField वर्तमान में छवियों से एनीमेशन अपने पैमाने पद्धति का उपयोग करके बढ़ाया खो देता है। मैंने आरजीबीए मोड में कनवर्ट करने की कोशिश नहीं की है लेकिन यह काम नहीं करता है।

पृष्ठभूमि: हमारे प्लोन इंस्टेंस पर हमने डिफ़ॉल्ट छवि प्रकार को संशोधित करने के लिए अपनी छवि फ़ील्ड के मूल_साइज विशेषता को सेट करने के लिए संशोधित किया है ताकि सभी छवियों को उचित गुणवत्ता सेटिंग के साथ स्केल किया जा सके। यह jpegs के लिए बहुत अच्छा काम करता है लेकिन इसका मतलब है कि हम वर्तमान में एनिमेटेड जीआईएफ

+0

एक पैलेट की गई छवि को स्केल करने की संभावना अस्वीकार्य छवि गुणवत्ता में होने की संभावना है। –

उत्तर

4

पीआईएल को एनिमेटेड जीआईएफ के लिए कुछ सीमित समर्थन मिला है, लेकिन जैसा कि कहा गया है, सीमित है, और आपको इससे निपटने के लिए बहुत कम स्तर पर काम करना है ।

यदि आप एनिमेटेड gif के साथ सौदा करना चाहते हैं तो मैं पीआईएल की तुलना में छवियों को स्केल करने के लिए किसी अन्य विधि की कोशिश करने की सलाह दूंगा। संभवतः, सबसे सरल तरीका उप-प्रोसेस ImageMagick का उपयोग उपप्रोसेस के साथ करना है। (और फिर भी, इस समय, मैं केवल एनिमेटेड जीआईएफ के साथ "सही चीज़" छविमेजिक का अनुमान लगा रहा हूं) -

एन विकल्प एक और "पाइंडन स्क्रिप्ट" के साथ एक "छवि प्रसंस्करण सर्वर" है, आपके ज़ोप इंस्टॉल के अलावा, जो छवियों को स्केल करने के अनुरोध प्राप्त करेंगे - संभवतः एक xmlrpc कॉल के साथ - आप इसे एक गिंप प्लग-इन के रूप में बना सकते हैं और जीआईएमपी का उपयोग कर सकते हैं जीआईएफ की स्केलिंग

एक और विकल्प चीजों को छोड़ना है, और एनिमेटेड जीआईएफ के लिए "स्टिल" का उपयोग करना है, जहां उन्हें मूल की तुलना में किसी अन्य आयाम में दिखने की आवश्यकता है, और मूल छवि को प्रदर्शित करें जहां एनीमेशन उचित है। (या शायद बस उस एनिमेटेड gif को पहले से उचित आकार पर सबमिट करने की आवश्यकता है)

+2

धन्यवाद। मैंने कोड tweaked है ताकि यह एनिमेटेड जीआईएफ छवियों को स्केल करने का प्रयास नहीं करता है अगर स्रोत छवि पैमाने से बड़ा नहीं है। Http://dev.plone.org/ticket/12488 – scarba05

+1

देखें मैंने पीआईएल पर एक और नजर डाली - इसे वास्तव में बहु-फ्रेम gifś पढ़ने का समर्थन है, लेकिन उन्हें बनाने या लिखने के लिए कोई समर्थन नहीं है। – jsbueno

7

आप gifs को पढ़ने और स्वतंत्र रूप से प्रत्येक फ्रेम को स्केल करने के लिए images2gif.py का उपयोग कर सकते हैं। images2gif आपको छवियों के अनुक्रम के साथ एक एनिमेटेड gif लिखने की अनुमति देगा।

इंटरनेट पर मिली छवियों 2gif.py ने पारदर्शिता को संभाला नहीं है, इसलिए मैंने इसे ठीक किया। आपको लगता है कि यहाँ पा सकते हैं: https://bitbucket.org/bench/images2gif.py

0

Pillow (जनहित याचिका का कांटा) संस्करण 3.0.0 के बाद से एनिमेटेड GIF का समर्थन करता है जब PR #1384 विलय हो गया।

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