上一篇中实践了一下静态图合成动态图,做了无限循环播放,对于不要求顺序的图片库来讲没有问题。
问题在于读取文件夹的顺序是按照首字顺序读取的,但若以月命名则会出现10月排在3月之前的情况,如果希望读取文件后按照月份大小排列就必须强制将首数转化为整数进行排序。
以下参考了Python生成 gif 动图这篇文章。
原文选用imageio库实现动图,这里接着使用pillow
import re
#将filenames存储为整数并按照大小排序,参考文章中首先利用三个自定义函数实现将文件名按数字拆分、按整数排序两项工作
def tryint(s): ##将元素中的数字转换为int后再排序
try:
return int(s)
except ValueError:
return s
def str2int(v_str): ##将元素中的字符串和数字分割开
return [tryint(sub_str) for sub_str in re.split('([0-9]+)', v_str)]
def sort_humanly(v_list): ##以分割后的list为单位进行排序
return sorted(v_list, key=str2int)
path='E:\\your direction'
path_files = []
for filenames in os.listdir(path):
if filenames.endswith('jpg') or filenames.endswith('jpeg') or filenames.endswith('png'):
filenames = str.join('',filenames)
path_files.append(filenames)
path_files = sort_humanly(path_files)
#print(path_files) 为了检查排序后的文件名是否正确,可以print出来瞅一眼
文件排序没有问题后生成gif图,方法和前文相同。loop改成1则按序播放一遍后停止在最后一张图上停止。
frames = []
for image_name in path_files:
im = Image.open(path+'\\'+image_name) # 这里需要加入path信息,后续和上一篇文章中一模一样
im = im.resize((1041, 1320),Image.ANTIALIAS)
frames.append(im)
# Save into a GIF file that loops forever
frames[0].save('my2.gif', format='GIF', append_images=frames[1:], save_all=True, duration=500, loop=1)