PIL Gif 生成未按预期工作

Posted

技术标签:

【中文标题】PIL Gif 生成未按预期工作【英文标题】:PIL Gif generation not working as expected 【发布时间】:2021-08-01 10:20:49 【问题描述】:

我想做的事:由于我对使用 PIL 库生成图像还很陌生,所以我决定尝试将图像放在 gif 之上。我可以使用的合适教程或参考资料并不多。

出了什么问题:通常不会生成 gif。这将给出错误IndexError: bytearray index out of range,我不确定如何修复。但是,有时会生成gif,但会出现一些错误。我在下面包含了其中一些 gif。

代码

@client.command()
async def salt(ctx, user:discord.Member=None):
    if user == None:
        user = ctx.author

    animated_gif = Image.open("salty.gif")
    response = requests.get(user.avatar_url)
    background = Image.open(BytesIO(response.content))
    
    all_frames = []
#    background = background.resize((500, 500))

    for gif_frame in ImageSequence.Iterator(animated_gif):

        # duplicate background image
        new_frame = background.copy()  

        # need to convert from `P` to `RGBA` to use it in `paste()` as mask for transparency
        gif_frame = gif_frame.convert('RGBA')  

        # paste on background using mask to get transparency 
        new_frame.paste(gif_frame, mask=gif_frame) 

        all_frames.append(new_frame)
        
    # save all frames as animated gif
    all_frames[0].save("image.gif", save_all=True, append_images=all_frames[1:], duration=50, loop=0)

这是我正在使用的 gif:

【问题讨论】:

这是一种可能性。 GIF 从技术上讲不具有透明度。传统上,左上角的任何像素都被指定为透明色。看起来您的帧有两个不同的左上角像素。您可以尝试将左上角像素强制为白色。 即使我可以,我也不知道该怎么做。你知道我可以用什么来帮助我朝着正确的方向前进吗? 从第一个像素的颜色中选择透明度的信息不正确。 GIF89A 规范允许使用一种透明颜色索引,这在标题中是明确的:giflib.sourceforge.net/whatsinagif/bits_and_bytes.html 【参考方案1】:

不幸的是,PIL 中对动画 GIF 的支持是错误的,而且很难使用。您显示的图像因图层与背景图层共享调色板信息而受到影响,因此它们的某些颜色会失真。

不知道有没有办法使用PIL来控制每一帧的调色板信息。

如果您想使用 Python 以编程方式生成 GIF,我现在建议您使用 GIMP 图像编辑器 - 在那里您可以使用程序以交互方式构建图像,或者使用 Python 控制台以编程方式构建图像,只需调用“另存为 gif”函数 (pdb.file_gif_save2)。

(我将看看 PIL 的确切功能,并检查我是否可以扩展正确处理透明度的答案 - 否则,GIMP 是要走的路)

【讨论】:

以上是关于PIL Gif 生成未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

VUE3 复合过滤器未按预期工作

PHP 中的 file_exists 未按预期工作

Aspnet Core 3.1 Identity ConfirmEmail 未按预期工作

CollectionView estimatedItemSize 未按预期工作

Vue计算属性未按预期工作[关闭]

Propel diff 命令未按预期工作