【问题标题】:Gifs opened with python have broken frames用python打开的gif有断帧
【发布时间】:2014-03-26 07:10:35
【问题描述】:

有时在打开 gif 并将单独的帧保存到文件时,帧的形状很糟糕。并非所有的 gif 都会出现这种情况,但有很多帧都会出现这种情况。

例子

这是原图

http://imgur.com/XMxW3m3

这是第一帧(出来没问题)

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)

这两个模块也是如此。

发生了什么事?

附: 我发现其他人也有同样的症状。但是,这些解决方案(两者都围绕 PIL 的错误,当您执行 .seek() 时删除调色板)并没有解决我的问题: Python: Converting GIF frames to PNGPIL - Convert GIF Frames to JPG

【问题讨论】:

    标签: python gif


    【解决方案1】:

    在 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
    

    编辑:将输出格式更改为 cmets 中建议的 png,因为否则会出现调色板问题。

    【讨论】:

    • 嗨!谢谢,但这不是故事的全部。它修复了缺失的部分,所以我猜你所说的有些道理,但它仍然是错误的,尽管方式不同:imgur.com/rham3RW
    • 嗨,我还在玩这个,我注意到如果你将图像保存为 png,这种方法实际上效果很好。因此,如果您将代码更改为 current.save('original0%d.png' % counter, 'PNG'),我会接受这个答案是正确的。顺便说一句,似乎保存为 png 比保存为 gif 慢得多。这是为什么?你知道如何将它保存为 gif,以使其更快吗?
    • 我创建了另一个问题,如果您有兴趣:stackoverflow.com/questions/21996710/…
    • 层可以包含信息,如果它们被合并或替换前一帧。我不知道如何用 pil/pillow 提取这些信息
    猜你喜欢
    • 2014-05-12
    • 2020-04-21
    • 2011-06-21
    • 2011-11-22
    • 1970-01-01
    • 2020-01-22
    • 2019-01-02
    • 2021-09-22
    • 1970-01-01
    相关资源
    最近更新 更多