Python:多张图片生成GIF图片

Python:多张图片生成GIF图片

准备工作

  1. 安装 imageio
  2. 准备多张测试图片,可直接使用上一篇文章内的测试结果图片 - 传送门

Python实现过程

import imageio

gif = []
# 存放多张测试图片的路径拼接
dir_path = os.path.join(os.path.dirname(__file__), 'test')
# 获取该文件夹内的全部文件
png = os.listdir(dir_path)
for i in png:
	# 添加图片,传入参数为图片地址,需拼接路径
	gif.append(imageio.imread(os.path.join(dir, i)))

# 生成GIF图
imageio.mimsave("test1.gif", gif, fps=5)	# fps值越大,生成的gif图播放就越快

测试结果

  • 实际生成的测试结果
    Python:多张图片生成GIF图片_第1张图片

  • 预期GIF图

Python:多张图片生成GIF图片_第2张图片

问题

经过对2张GIF图片的比对,发现生成的图片与原GIF图的帧数顺序是不一致的

排查发现是因为png = os.listdir(dir_path),生成list的排序问题

png = os.listdir(dir_path)
print(png)

# ['第10帧.png', '第11帧.png', '第12帧.png', '第13帧.png', '第1帧.png', '第2帧.png', '第3帧.png', '第4帧.png', '第5帧.png', '第6帧.png', '第7帧.png', '第8帧.png', '第9帧.png']

由此可以看出,因为listdir遍历的文件顺序与预期是是不一致的,所以导致生成的图片与原图是不一致

解决方法:

  • 通过list的sort方法对列表进行排序,使其达到预期的排序效果
  • 由于列表内文件名为有规律格式,可使用正则取出中间数字,再以该数字排序为key,进行排序
import re

png = os.listdir(dir_path)
print(png)
# ['第10帧.png', '第11帧.png', '第12帧.png', '第13帧.png', '第1帧.png', '第2帧.png', '第3帧.png', '第4帧.png', '第5帧.png', '第6帧.png', '第7帧.png', '第8帧.png', '第9帧.png']

png.sort(key=lambda x: int(re.findall(r'第(.*>?)帧', x)[0]))	# 默认升序,即reverse = False
print(png)

# 排序后的顺序
# ['第1帧.png', '第2帧.png', '第3帧.png', '第4帧.png', '第5帧.png', '第6帧.png', '第7帧.png', '第8帧.png', '第9帧.png', '第10帧.png', '第11帧.png', '第12帧.png', '第13帧.png']
  • 最终结果
    Python:多张图片生成GIF图片_第3张图片

  • 倒序GIF图

    import re
    
    png = os.listdir(dir_path)
    
    # 列表倒序排序
    png.sort(key=lambda x: int(re.findall(r'第(.*>?)帧', x)[0]), reverse=True)
    print(png)
    
    # ['第13帧.png', '第12帧.png', '第11帧.png', '第10帧.png', '第9帧.png', '第8帧.png', '第7帧.png', '第6帧.png', '第5帧.png', '第4帧.png', '第3帧.png', '第2帧.png', '第1帧.png']
    

Python:多张图片生成GIF图片_第4张图片

你可能感兴趣的:(Python学习,GIF,合成GIF,python合成GIF,python)