How to Read and Write gifs in python, PIL 和 imageio 似乎不起作用
How to Read and Write gifs in python, PIL and imageio don't seem to work
我已经尝试了大约一天的时间来为 python 中的图像查看器读取 gif 文件,但没有任何效果。大多数文件都可以正常加载,但有些文件会保留来自图像帧处理不当的伪影。根据我的阅读,它似乎与 PIL 的透明度管理有关 and/or 它在 RGBA 和 PA 图像模式之间转换的方式。最简单的用imageio加载然后保存gif的例子如下所示。
import imageio
gif = imageio.mimread("test.gif")
imageio.mimwrite("out.gif", gif)
这与 PIL 类似:
from PIL import Image
gif = Image.open("test.gif")
gif.save("out.gif", save_all=True)
两者产生相同的结果,这并不奇怪,因为 imageio 依赖于 PIL
我已经尝试了所有我能找到的命令和参数的组合,它们看起来可能有帮助,比如手动设置调色板和透明度,以及使用不同的 "disposal" 值来改变框架的方式被合并。我也尝试过使用 seek() 将所有帧提取到一个数组中并从中创建一个 gif,但 PIL 似乎无法正确解析某些 GIF。这是一个示例输入和输出:
(第二个 gif 的调色板已被压缩到 2MB 以下,但即使有差异也可以忽略不计)
input gif output gif
我非常确信您的测试图像不完全符合 GIF 标准:甚至某些图像查看器也不会显示正确的动画(但它在我测试过的所有浏览器中都能正确显示)。这可以解释您只注意到少数测试图像的问题。
为了验证这种直觉,我提取了所有帧,并使用它们在新的 GIF 文件中重新生成动画(许多软件都可以完成这样的任务,您甚至可以使用一些在线网站来完成此任务)。你猜怎么着 ?这个新文件没有显示任何 PIL 问题。
我已经尝试了大约一天的时间来为 python 中的图像查看器读取 gif 文件,但没有任何效果。大多数文件都可以正常加载,但有些文件会保留来自图像帧处理不当的伪影。根据我的阅读,它似乎与 PIL 的透明度管理有关 and/or 它在 RGBA 和 PA 图像模式之间转换的方式。最简单的用imageio加载然后保存gif的例子如下所示。
import imageio
gif = imageio.mimread("test.gif")
imageio.mimwrite("out.gif", gif)
这与 PIL 类似:
from PIL import Image
gif = Image.open("test.gif")
gif.save("out.gif", save_all=True)
两者产生相同的结果,这并不奇怪,因为 imageio 依赖于 PIL
我已经尝试了所有我能找到的命令和参数的组合,它们看起来可能有帮助,比如手动设置调色板和透明度,以及使用不同的 "disposal" 值来改变框架的方式被合并。我也尝试过使用 seek() 将所有帧提取到一个数组中并从中创建一个 gif,但 PIL 似乎无法正确解析某些 GIF。这是一个示例输入和输出: (第二个 gif 的调色板已被压缩到 2MB 以下,但即使有差异也可以忽略不计)
input gif output gif
我非常确信您的测试图像不完全符合 GIF 标准:甚至某些图像查看器也不会显示正确的动画(但它在我测试过的所有浏览器中都能正确显示)。这可以解释您只注意到少数测试图像的问题。
为了验证这种直觉,我提取了所有帧,并使用它们在新的 GIF 文件中重新生成动画(许多软件都可以完成这样的任务,您甚至可以使用一些在线网站来完成此任务)。你猜怎么着 ?这个新文件没有显示任何 PIL 问题。