需求
想要制作可以课上展示的动图或视频,视频最佳。
环境
VSCODE+PYTHON3
所需材料
视频所需要的图片(以微幅波为例),利用python 画图。
先画一个简单的波形图
VSCODE里动态显示
为了直观测试,首先需要在一个图框中展示图片的变化
所以查找相关资料,找到了这个博客:
https://blog.csdn.net/u013468614/article/details/58689735
简单来说是每次要清空画布,然后要有间隔:
f1= plt.figure(1)
for jt in range(100):
for i in range(len(x)):
eltax[i]=SMW_elta(A,k,x[i],sigma,t+jt/2)
plt.clf() #清空画布
plt.plot(x,eltax)
plt.draw()
plt.pause(0.005) #时间间隔
plt.show()
下一步,GIF生成
首先先把多张图进行输出
用的是输出函数
figname='path'+str(jt)+'.jpg' #注意这边不要用[]
plt.savefig(figname)
然后将图片合成GIF
参考 https://blog.csdn.net/monotonomo/article/details/80586194
我先试了images2gif,结果图片都是闪烁的,还不如用imageio
# -*- coding: utf-8 -*-
# GIF generator
from PIL import Image
import numpy as np
import imageio
outfilename='e:/python_code/Coast_Engineering/f1/SAW_eta_test.gif'
foldn='e:/python_code/Coast_Engineering/f1/SAW_eta'
filenames = []
for i in range(100): # 读取100张图片
filename = foldn+str(i)+'.jpg' # path是图片所在文件,最后filename的名字必须是存在的图片
filenames.append(filename) # 将使用的读取图片汇总
frames = []
for image_name in filenames: # 索引各自目录
im = Image.open(image_name) # 将图片打开,本文图片读取的结果是RGBA格式,如果直接读取的RGB则不需要下面那一步
# im = im.convert("RGB") # 通过convert将RGBA格式转化为RGB格式,以便后续处理
im = np.array(im) # im还不是数组格式,通过此方法将im转化为数组
frames.append(im) # 批量化
imageio.mimsave(outfilename, frames, 'GIF', duration=0.1)
测试生成视频
参考 https://blog.csdn.net/Bugest/article/details/81119980
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# MP4 generator
from PIL import Image
import numpy as np
import os
import cv2
import time
outfilename= "e:/python_code/Coast_Engineering/SAW.mp4"#导出路径
foldn='e:/python_code/Coast_Engineering/f1/SAW_eta'
fps = 10 #帧率
size = (640,479) #图片的分辨率
#fourcc = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
fourcc = cv2.VideoWriter_fourcc('D', 'I', 'V', 'X')
video = cv2.VideoWriter( outfilename, fourcc, fps, size )
filenames=[]
for i in range(100): # 读取100张图片
filename = foldn+str(i)+'.jpg' # path是图片所在文件,最后filename的名字必须是存在的图片
filenames.append(filename) # 将使用的读取图片汇总
frames = []
for item in filenames:
img = cv2.imread(item) #使用opencv读取图像,直接返回numpy.ndarray 对象,通道顺序为BGR ,注意是BGR,通道值默认范围0-255。
video.write(img) #把图片写进视频
video.release() #释放