当我尝试使用fraxel的答案时
http://stackoverflow.com/questions/10269099/pil-convert-gif-frames-to-jpg
在图片http://24.media.tumblr.com/fffcc2d8e980fbba4f87d51ed4916b87/tumblr_mh8uaqMo2I1rkp3avo2_250.gif
我为某些人获得了正确的数据,但是对于某些人来说,我看到的数据很少,例如
要显示这些,我使用imagemagick的display foo*
,然后使用空格来移动图像...图像识别是否可能读错了?
编辑:
即使使用转换然后通过display foo*
显示,我也会得到以下内容
这可能是gif的特征吗?
答案 0 :(得分:3)
如果您坚持使用ImageMagick,那么解决这个问题非常简单:
convert input.gif -coalesce output.png
否则,您将不得不考虑如何构造每个GIF帧的不同形式。对于这种特定类型的GIF,以及您在其他问题中显示的其他类型,以下代码有效(请注意,在您之前的问题中,接受的答案实际上并未使所有拆分部分透明 - 至少是最新的发布PIL):
import sys
from PIL import Image, ImageSequence
img = Image.open(sys.argv[1])
pal = img.getpalette()
prev = img.convert('RGBA')
prev_dispose = True
for i, frame in enumerate(ImageSequence.Iterator(img)):
dispose = frame.dispose
if frame.tile:
x0, y0, x1, y1 = frame.tile[0][1]
if not frame.palette.dirty:
frame.putpalette(pal)
frame = frame.crop((x0, y0, x1, y1))
bbox = (x0, y0, x1, y1)
else:
bbox = None
if dispose is None:
prev.paste(frame, bbox, frame.convert('RGBA'))
prev.save('foo%02d.png' % i)
prev_dispose = False
else:
if prev_dispose:
prev = Image.new('RGBA', img.size, (0, 0, 0, 0))
out = prev.copy()
out.paste(frame, bbox, frame.convert('RGBA'))
out.save('foo%02d.png' % i)
最终,您必须重新创建-coalesce
所做的事情,因为上面的代码可能无法与某些GIF图像一起使用。
答案 1 :(得分:-1)
你应该尝试将帧的整个历史记录保存在“背景”中,而不是:
background = Image.new("RGB", size, (255,255,255))
background.paste( lastframe )
background.paste( im2 )
只需在循环之前创建一次“背景”,然后只在其上粘贴()框架,它应该可以工作。