Python 利用PIL由多张图片合成gif动画

  • Python 由多张图片合成gif动画


  • 案例
import os
figure_save_path = "file_fig_test"
import warnings
warnings.filterwarnings("error")
import numpy as np
np.random.seed(0)
import matplotlib.pyplot as plt
from PIL import Image
import time

num = 100
gif_frames = []
open_time = []
save_time = []
plot_time = []

for i in range(num):
    #图形绘制
    start_time = time.time()
    plt.scatter(np.random.random(), np.random.random())
    end_time = time.time()
    plot_time.append(end_time-start_time)

    #创建图形保存文件夹
    if not os.path.exists(figure_save_path):
        os.makedirs(figure_save_path)
    else:
        pass

    #保存图形
    start_time = time.time()
    plt.savefig(os.path.join(figure_save_path, str(i) + ".jpg"))
    end_time = time.time()
    save_time.append(end_time-start_time)

    #打开图形
    start_time = time.time()
    img = Image.open(os.path.join(figure_save_path, str(i) + ".jpg"))
    end_time = time.time()
    open_time.append(end_time-start_time)

    gif_frames.append(img)

print("动画绘制开始")
start_time = time.time()
gif_frames[0].save("test.gif",
        save_all=True, append_images=gif_frames[1:], duration=200, loop=0)
end_time = time.time()
print("动画绘制完成,用时:", round(end_time-start_time, 6))
print("平均动画绘制完成,用时:", round((end_time-start_time)/num, 6))

print("平均图形绘制用时:", round(sum(plot_time)/len(plot_time), 6))
print("平均图形保存用时:", round(sum(save_time)/len(save_time), 6))
print("平均图形打开用时:", round(sum(open_time)/len(open_time), 6))
  • 动画生成结果就不放了

  • 让我们看看什么操作最耗时
动画绘制开始
动画绘制完成,用时: 3.61503
平均动画绘制完成,用时: 0.03615
平均图形绘制用时: 0.004437
平均图形保存用时: 0.146415
平均图形打开用时: 0.000287

  • 这是保存图形用时随图像数量的变化 
    • 考虑到绘制点数的增长,这是合理的


  •  这是图形打开用时
    • 变换不大,这是合理的


  • 这是每次scatter的用时
    • 看上去也比较合理


  • 那我们再看看随着图片数量的增长,绘制动画的用时变化
gif_time = []
for i in range(20, 100):
    new_frames = gif_frames[:i]
    start_time = time.time()
    new_frames[0].save(str(i)+".gif",
        save_all=True, append_images=gif_frames[1:], duration=200, loop=0)
    end_time = time.time()
    gif_time.append(end_time-start_time)
    print("finished:", str(i))

  • 这就比较迷
    • 不过问题不大

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

River Chandler

谢谢,我会更努力学习工作的!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值