从GIF到PNG提取帧时数据丢失?

时间:2013-01-27 17:28:55

标签: image-processing imagemagick python-imaging-library tumblr gif

当我尝试使用fraxel的答案时

http://stackoverflow.com/questions/10269099/pil-convert-gif-frames-to-jpg

在图片http://24.media.tumblr.com/fffcc2d8e980fbba4f87d51ed4916b87/tumblr_mh8uaqMo2I1rkp3avo2_250.gif

我为某些人获得了正确的数据,但是对于某些人来说,我看到的数据很少,例如

正确

Correct_1 Correct_2

缺少

Missing_1 enter image description here

要显示这些,我使用imagemagick的display foo*,然后使用空格来移动图像...图像识别是否可能读错了?

编辑:

即使使用转换然后通过display foo*显示,我也会得到以下内容

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

这可能是gif的特征吗?

2 个答案:

答案 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 )

只需在循环之前创建一次“背景”,然后只在其上粘贴()框架,它应该可以工作。