4

当我尝试使用 fraxel 的答案时

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

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

我得到了一些好的数据,但是对于一些我得到了丢失的数据,它看起来像,例如

正确的

正确_1 正确_2

失踪

缺少_1 在此处输入图像描述

为了显示这些,我使用 imagemagick'sdisplay foo* 然后使用空间来移动图像......是否可能 imagemagick 读错了?

编辑:

即使使用转换然后显示通过display foo* 我得到以下

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

那么,这可能是 gif 的特征吗?

4

2 回答 2

3

如果您可以坚持使用 ImageMagick,那么解决此问题非常简单:

convert input.gif -coalesce output.png

否则,您将不得不考虑如何构建每个 GIF 帧的不同形式。对于这种特定类型的 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 图像。

于 2013-01-27T18:49:38.890 回答
-1

您应该尝试将帧的整个历史记录保留在“背景”中,而不是:

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

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

于 2013-01-27T17:54:54.847 回答