主要内容概述:
- 预备知识
- MATLAB 代码实现GIF
- 使用imageio 生成GIF
- 使用animation 交互式方式生成GIF
- 总结
0,预备知识
首先了解下什么是GIF 图片,以及常用的图片格式。
GIF的全称是Graphics Interchange Format,可译为图形交换格式,用于以超文本标志语言(Hypertext Markup Language)方式显示索引彩色图像,在因特网和其他在线服务系统上得到广泛应用。GIF是一种位图。位图的大致原理是:图片由许多的象素组成,每一个象素都被指定了一种颜色,这些象素综合起来就构成了图片。
一图胜千言,GIF 动图更是图片中的战斗机!
下面我们就分别从Python 和MATLAB 介绍Git 动图的制作方法。
一,在MATLAB 中实现GIF动图制作
效果:下面是一个制作矩形函数和其频谱的动图。
Note:主要的思想就是画出第一张图,然后在追加第二张,第三张图,并设置其延时时间
主要函数介绍:
1 Getframe 函数
F = getframe(h) gets a frame from the figure or axes identified by handle h.
获取句柄定义的图片或是坐标的一帧。
如果想获得图片的一帧使用的语法为。
F = getframe(gcf);
2 frame2im
Return image data associated with movie frame
帧图画转换为图像数据
3 rgb2ind
Convert RGB image to indexed image
将RGB 图片转换为索引图片
4 imwrite
Imwrite (A, filename,fmt) writes the image A to the file specified by filename in the format specified by fmt.
5 完整代码如下:
clc; clear all; close all;
N=10000; % sampling numbers
Tau0=1; % define initial Tau
pic_num = 1;
for i=1:100Tau=Tau0/i; TimeRange=linspace(-10*Tau,10*Tau,N); % display time rangeFreqRange=linspace(-200*pi/i,200*pi/i,N); % display frequency rangeHalf_Tau=Tau/2; % -0.5 Tao ==> 0.5 TaoRECT=1/Tau*double(abs(TimeRange)<Half_Tau); % one rectangular pulseSINC=sinc(FreqRange*Tau*pi); % sinc pulse, Xtrasubplot(2,1,1);plot(TimeRange,RECT,'LineWidth',1.5); grid on;xlim([-1 1]); ylim([-0.5 120]);xlabel('Time'); ylabel('Amplitude');subplot(2,1,2);plot(FreqRange,SINC,'LineWidth',1.5); grid on; xlim([-200*pi/i 200*pi/i]); ylim([-0.5 1.5]); xlabel('Frequency'); ylabel('Amplitude');drawnow;F=getframe(gcf);I=frame2im(F);[I,map]=rgb2ind(I,256);if pic_num == 1imwrite(I,map,'impulse.gif','gif', 'Loopcount',inf,'DelayTime',0.1);elseimwrite(I,map,'impulse.gif','gif','WriteMode','append','DelayTime',0.1);endpic_num = pic_num + 1;
end
二,Python 中GIF动图的绘制
1,使用imageio 生成GIF 动态图像
IMAIO是一个Python库,它提供了一个简单的接口来读取和写入大量的图像数据,包括动画图像、体积数据和科学格式。它是跨平台的,运行在Python 2 .x和3.x上,并且易于安装。
imageio.imread() #从指定的文件读取图像。返回一个NUMPY数组,该数组带有元数据的元属性。注意,图像数据按原样返回,并且可能不总是具有uTI8的dType。
def createGif():images = []filenames=sorted((fn for fn in os.listdir('image') if fn.endswith('.png')))# 分解顺序和合成顺序不一致,造成Gig 混乱n = len(filenames)for i in range (0,n):filename =str(i)+'.png'if (filename in filenames):images.append(imageio.imread('image'+filename))
imageio.mimsave('gif.gif', images,duration=0.1)
def main():processImage('impulse.gif')createGif()
if __name__=='__main__':main()
2,使用animation 交互式方式
介绍:使用animation function 来动态的显示一个sin函数。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
x = np.linspace(0, 10, 100) # 生成测试数据
y = np.sin(x)fig, ax = plt.subplots()
line= ax.plot(x, y, color='k')def update(num, x, y, line): #num表示迭代次数line.set_data(x[:num], y[:num])line.axes.axis([0, 10, -1.2, 1.2])return line,
FuncAnimation函数生成动画。参数说明:
#fig 进行动画绘制的figure 的句柄
#func 自定义动画函数,即传入刚定义的函数animate
#frames 动画长度,一次循环包含的帧数
#fargs 除帧数之外的其他需要调用的参数
#init_func 自定义开始帧。
#interval 更新频率,以ms计
#blit 选择更新所有点,还是仅更新产生变化的点。应选择True,但mac用户请选择False,否则无法显示动画
# 调用FuncAnimation 生成GIF 动画
ani = animation.FuncAnimation(fig, update, len(x), fargs=[x, y, line],
interval=25, blit=True,repeat= True)
ani.save('test.gif') # 保存成GIF动态图格式
plt.show()
总结:
本文主要讲述了GIF 图片格式及用MATLAB 和Python的实现方式。
其中Python实现介绍了两种方式:1用现有的图片生成。2使用animation函数实现。