从GIF中提取帧的问题更多了。

3

针对我之前的问题(使用Python打开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, 'PNG')
        img.seek(img.tell()+1)
        current = Image.alpha_composite(current, img.convert('RGBA'))
        counter += 1
    except EOFError:
        break

该工具在大多数GIF上完美运作,但在其他一些GIF上会产生奇怪的结果。例如,当应用于这个2帧的GIF时:

GIF

它将生成以下两个帧:

Frame 1 Frame 2

第一个还可以,第二个就不太行了。

现在怎么办?


尝试在不与第一个帧合成的情况下查看第二个帧,看看像素有哪些变化和未变化,以确定它是否符合预期。 - martineau
2个回答

1
听起来你想要做这个:

while True:
    try:
        current.save('original%d.gif' % counter)
        img.seek(img.tell()+1)
        current = img.convert('RGBA')
        counter += 1
    except EOFError:
        break

你真的没有仔细阅读之前的问题,是吗?我的上一个问题确切地说就是那段代码不起作用。 - user1950164
好的。那么你的问题是什么?这种方法或另一个SO用户提供的方法有什么问题吗? - Clarus
在我的问题中,我说了问题所在:当将该代码应用于某些gif图像时,仍会产生错误的结果。 - user1950164
结果有什么问题。你展示的结果看起来像是在另一张图片上合成了一张图片。我的解决方案应该(大概)是没有合成的图片。 - Clarus
1
如果您阅读了我的先前问题,您会发现组合是必要的,因为gif仅保存帧之间的更改。因此,您拥有的不是“解决方案”。请阅读链接的问题。 - user1950164

1

试试使用 Wand (Wand是一个基于ctypes的Python简单ImageMagick绑定库。)

from wand.image import Image

def extract_frames(gif_file):
    with Image(filename=gif_file) as gif:
        for i, single_img in enumerate(gif.sequence):
            with Image(image=single_img) as frame:
                frame.format = 'PNG'
                frame.save(filename='frame-%d.png' % i)

extract_frames('test.gif')

frame-0

frame-0.png

frame-1

frame-1.png


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接