2012-04-22 17 views
14

को GIF फ्रेम्स कन्वर्ट मैं अजगर छवि लाइब्रेरी, साथ एकल छवियों के लिए एक gif परिवर्तित करने की कोशिश की, लेकिन यह अजीब फ्रेमजनहित याचिका - जेपीजी

में जो परिणाम

इनपुट gif है:

Source Image http://longcat.de/gif_example.gif

में मेरी पहली कोशिश, मैंने इमेज.न्यू से आरजीबी छवि के साथ छवि को कन्वर्ट करने की कोशिश की, 255,255,255 सफेद पृष्ठभूमि के रूप में - किसी भी अन्य उदाहरण की तरह मैंने इंटरनेट पर पाया है:

लेकिन यह अजीब उत्पादन फाइलों में परिणाम:

Example #1 http://longcat.de/gif_example1.jpg

मेरी दूसरी कोशिश थी एक RGBA में gif परिवर्तित करने के लिए पहले, और फिर इसकी पारदर्शिता मुखौटा का उपयोग करें, पारदर्शी टुकड़े सफेद बनाने के लिए:

def processImage(infile): 

    try: 
     im = Image.open(infile) 
    except IOError: 
     print "Cant load", infile 
     sys.exit(1) 

    i = 0 

    try: 
     while 1: 

      im2 = im.convert('RGBA') 
      im2.load() 

      background = Image.new("RGB", im2.size, (255, 255, 255)) 
      background.paste(im2, mask = im2.split()[3]) 
      background.save('foo'+str(i)+'.jpg', 'JPEG', quality=80) 

      i += 1 
      im.seek(im.tell() + 1) 

    except EOFError: 
     pass # end of sequence 

जो इस तरह एक आउटपुट में परिणाम:

Example #2 http://longcat.de/gif_example2.jpg

पहली कोशिश पर लाभ था, कि पहले फ्रेम बहुत अच्छी लग रहा है लेकिन जैसा कि आप देख सकते हैं, बाकी टूट गया है

क्या मैं अगले की कोशिश करनी चाहिए?

संपादित करें:

मैं मैं एक बहुत समाधान के करीब

Example #3 http://longcat.de/gif_example3.png

मैं, अन्य चित्रों के लिए पहली छवि का पैलेट का उपयोग करें और साथ मर्ज करने के लिए किया था आया लगता है पिछले फ्रेम

def processImage(infile): 

    try: 
     im = Image.open(infile) 
    except IOError: 
     print "Cant load", infile 
     sys.exit(1) 

    i = 0 

    size  = im.size 
    lastframe = im.convert('RGBA') 
    mypalette = im.getpalette() 

    try: 
     while 1: 

      im2 = im.copy() 
      im2.putpalette(mypalette) 

      background = Image.new("RGB", size, (255,255,255)) 

      background.paste(lastframe) 
      background.paste(im2) 
      background.save('foo'+str(i)+'.png', 'PNG', quality=80) 

      lastframe = background 

      i += 1 
      im.seek(im.tell() + 1) 

    except EOFError: 
     pass # end of sequence 

लेकिन मैं एसी (जो diff-छवियों का उपयोग GIF एनिमेशन के लिए) क्यों मेरे पारदर्शिता काला है tually, न पता है, बजाय सफेद की यहां तक ​​कि अगर मैं पैलेट को संशोधित (सफेद करने के लिए पारदर्शिता चैनल बदल) या पारदर्शिता मुखौटा का उपयोग करें, पृष्ठभूमि अभी भी काला है

उत्तर

18

सबसे पहले, JPEG पारदर्शिता का समर्थन नहीं करता है! लेकिन यह एकमात्र समस्या नहीं है ..जैसे ही आप GIF के अगले फ्रेम पर जाते हैं palette जानकारी खो जाती है (problem witn PIL?) - इसलिए PIL सही ढंग से RGBA ढांचे में परिवर्तित करने में असमर्थ है (इसलिए पहला फ्रेम ठीक है, लेकिन बाकी सभी खराब हैं)। तो कार्य-आसपास प्रत्येक फ्रेम के लिए palette वापस जोड़ना है, (जो आप अपने अंतिम कोड उदाहरण में कर रहे थे, लेकिन आपकी परेशानी यह थी कि आप RGBRGBA नहीं सहेज रहे थे, इसलिए आपके पास अल्फा/पारदर्शिता चैनल नहीं था। इसके अलावा आप कुछ अनावश्यक चीजें कर रहे थे ..)। किसी भी तरह, यहाँ पारदर्शिता और सही कोड के साथ .png के कर रहे हैं, उम्मीद है कि कुछ का उपयोग :)

enter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description here

import Image 
import sys 

def processImage(infile): 
    try: 
     im = Image.open(infile) 
    except IOError: 
     print "Cant load", infile 
     sys.exit(1) 
    i = 0 
    mypalette = im.getpalette() 

    try: 
     while 1: 
      im.putpalette(mypalette) 
      new_im = Image.new("RGBA", im.size) 
      new_im.paste(im) 
      new_im.save('foo'+str(i)+'.png') 

      i += 1 
      im.seek(im.tell() + 1) 

    except EOFError: 
     pass # end of sequence 

processImage('gif_example.gif') 
+0

बहुत बहुत धन्यवाद! मैं आखिरी फ्रेम के साथ पेस्ट का उपयोग करता हूं, क्योंकि कुछ gifs प्रत्येक फ्रेम के लिए diffs का उपयोग करता है! – Schinken

+1

उहम, इस तरह के पैलेट को बदलने से फ्रेम के अलग-अलग पैलेट होने पर गलत परिणाम मिलेंगे। यह छवि http://www.imagemagick.org/Usage/anim_opt/bunny_bgnd.gif है (मुझे लगता है, मुझे यकीन नहीं है कि मैं सही लिंक कॉपी और पेस्ट कर रहा हूं)। दूसरी समस्या जो मैं देखता हूं वह पीआईएल संस्करणों के बीच मतभेदों से संबंधित हो सकती है, लेकिन मुझे आपके जैसा ही परिणाम नहीं मिलता है (मुझे पहले फ्रेम को छोड़कर सभी फ्रेमों में भूरे रंग के क्षेत्र मिलते हैं, जहां यह पारदर्शी होना चाहिए)। Http://www.imagemagick.org/Usage/anim_opt/bunny_bgnd_opttrans.gif जैसे gif के लिए भी ऐसा ही होता है। – mmgp

+0

@mmgp - हम्म, हाँ, मैं देख सकता हूं कि अलग-अलग पैलेट वाले फ्रेम एक समस्या पैदा कर सकते हैं। मैं मानता हूं कि आपके परिणाम अलग-अलग परिणाम हो सकते हैं। दुर्भाग्यवश, मेरे पास इस समय इसे देखने का समय नहीं है, अगर आपके पास कोई फिक्स है तो कृपया मेरा जवाब संपादित करें, या अपना खुद का जोड़ें। अच्छा है। – fraxel

4

जब एक पर एक छवि को देखने छवि दर्शक, यहां तक ​​कि पारदर्शिता शून्य पर सेट होने पर भी, यह छवि को काले रंग के रूप में प्रदर्शित करती है। यह सुनिश्चित करने का एक तरीका है कि आपकी छवि वास्तव में पारदर्शी है, इसे दूसरे पर विलय करना है। 'इमोटिकॉन' जबकि अन्य image.Try में बाधा डालने नहीं देखा जाना चाहिए:

background = Image.open('someimage.jpg') #an existing image 
foreground = Image.open('foo.jpg') #one of the above images 
background.paste(foreground, (0,0), foreground) 
background.save('trial.jpg') #the composite image 

सैद्धांतिक रूप से, अगर आप छवि दर्शक में 'trial.jpg' खोलने के लिए और प्रारंभिक छवि की सामग्री संरक्षित और के शीर्ष पर है यह foo छवि है, तो आप निश्चित रूप से जान लेंगे कि यह केवल छवि दर्शक है और आपकी छवियां ठीक हैं ...

+0

.jpeg पारदर्शिता का समर्थन नहीं करता की अपनी :( – fraxel

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