使用Python中的Imageio从图像制作GIF

39

我尝试了很多在线例子,并发现imageio是完美的包。还在这里找到了写作的例子

我只是按照示例进行了操作并尝试了以下内容。

import imageio as io
import os
file_names = sorted((fn for fn in os.listdir('.') if fn.startswith('surface')))
#making animation
with io.get_writer('surface.gif', mode='I', duration=0.5) as writer:
    for filename in file_names:
        image = io.imread(filename)
        writer.append_data(image)
writer.close()

还有另一个例子。

images = []
for filename in file_names:
    images.append(io.imread(filename))
io.mimsave('surface1.gif', images, duration = 0.5)

这两个都不起作用。基本上,我只看到gif的第一帧和一个闪烁就结束了。持续时间设置为0.5秒,所以应该没有问题。也许我在这里漏掉了什么。


1
两种方法都适用于Python 2.7.1和´imageio´ 2.1.2 (1 2),使用多个.png图像。您确定要使用的所有图像都被选中了吗?检查file_names列表以查看它们是否都在那里。 - berna1111
我已经尝试了第一种方法。它可以处理大约758个.png文件。但是我有大约3000个.png文件,而在第758个文件之后的文件没有追加在.gif文件中。这有什么原因吗?我知道file_names数组包含这些文件。请参考https://stackoverflow.com/questions/44650649/why-is-my-gif-missing-png-files-after-250-iterations 以了解更多关于我的问题的信息。谢谢!! - user77005
1
请查看 https://www.quora.com/How-long-can-a-GIF-animate - Dave Babbitt
持续时间应以毫秒而非秒为单位设置。 - undefined
2个回答

41

这对我有效:

import os
import imageio

png_dir = '../animation/png'
images = []
for file_name in sorted(os.listdir(png_dir)):
    if file_name.endswith('.png'):
        file_path = os.path.join(png_dir, file_name)
        images.append(imageio.imread(file_path))

# Make it pause at the end so that the viewers can ponder
for _ in range(10):
    images.append(imageio.imread(file_path))

imageio.mimsave('../animation/gif/movie.gif', images)

这是我迄今为止找到的最简单和优雅的解决方案。一个建议,将sorted函数添加到list_dir函数之前: sorted(os.listdir(png_dir)) - Comos
我正在尝试这个解决方案,但问题在于图像透明度,在创建GIF时某些图像颜色发生了变化。 - Dhyn amicable
@Kunal,在合并这些gif之前,你需要让它们的颜色调色板保持一致。请自行学习如何做到这点。 - Dave Babbitt
1
@DaveBabbitt 我正在使用这个解决方案,但是在图像中遇到了颜色变化的问题。请使用PIL,但只需记住一件事,即1秒等于100毫秒。 - Dhyn amicable
1
我们如何减缓gif的速度? - Mohamed Hachaichi
1
imageio.mimsave函数有一个duration=参数,单位为秒。 - Dave Babbitt

28

如果有人需要的话, 对于Python 3.6.8,它需要 fps

imageio.mimsave('/path/file.gif',images,fps=55)

它不再支持fps,这是哪个版本的imageio,以便我可以使用它? - vs07

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