2014-02-24 14 views
2

有時,當打開gif並將單獨的框架保存到文件時,框架出現不良形狀。這不會發生在所有的gif中,但與那些發生在許多幀中的情況不同。用蟒蛇打開的Gif有破碎的框架

這裏的原始GIF

http://imgur.com/XMxW3m3

這裏的第一個幀(出來OK)

http://imgur.com/xv43alb

這裏的第二幀(弄出來擰)

http://imgur.com/hG4VxzL

我試着用兩個不同的python模塊做同樣的事情。首先PIL

from PIL import Image 

img = Image.open('pigs.gif') 

counter = 0 
collection = [] 
while True: 
    try: 
     img.save('original%d.gif' % counter) 
     img.seek(img.tell()+1) 
     counter += 1 
    except EOFError: 
     break 

然後魔杖:

from wand.image import Image 

img = Image(filename='pigs.gif') 

for i in range(len(img.sequence)): 
    img2 = Image(img.sequence[i]) 
    img2.save(filename='original%d.gif' % i) 

和同樣的情況,這兩個模塊。

發生了什麼事?

P.S .: 我發現其他人有相同的症狀。然而,這些解決方案(兩者都圍繞着它刪除調色板PIL的一個bug,當你做.seek())並沒有解決我的問題: Python: Converting GIF frames to PNGPIL - Convert GIF Frames to JPG

回答

5

在GIF的幀只可能包含在該幀中改變的像素。所以當你出口時,你會在沒有變化的地方變黑。

from PIL import Image 

img = Image.open('pigs.gif') 

counter = 0 
collection = [] 
current = img.convert('RGBA') 
while True: 
    try: 
     current.save('original%d.png' % counter) 
     img.seek(img.tell()+1) 
     current = Image.alpha_composite(current, img.convert('RGBA')) 
     counter += 1 
    except EOFError: 
     break 

編輯:更改輸出格式爲png,因爲顏色調色板問題,否則發生的意見中建議。

+0

嗨!謝謝,但那不是整個故事。它修復了缺失的部分,所以我猜這裏有一些你說的事實,但它仍然出錯,雖然以不同的方式: http://imgur.com/rham3RW – oneloop

+1

嗨,我還在玩這個和我注意到如果你保存的圖像是PNG,這種方法實際上是完美的。因此,如果您將您的代碼更改爲current.save('original0%d.png'%counter,'PNG'),我將接受此答案爲正確的。 順便說一句,似乎保存爲PNG比保存爲gif慢得多。這是爲什麼?你知道如何將它保存爲gif,使其更快? – oneloop

+0

我創建了另一個問題,如果你感興趣:http://stackoverflow.com/questions/21996710/more-problems-extracting-frames-from-gifs – oneloop