MATLAB #Dataprocessing

GIF现如今广泛流行于网络平台,因为其比图片具有更多的信息,同时又比视频具有更小的体积。

在科研、工作中,经常会需要将一个过程动态的展示出来,之前都是登录一些在线网站,上传生成的图片,没有网络的话就不方便,同时也不利于信息安全。

我最近发现MATLAB直接生成GIF也是非常方便的,写一篇笔记记录。

方法1:直接绘图并生成GIF

第一种方法是直接生成GIF,实现的方法可以通过直接在MATLAB搜索GIF关键词来找到。需要首先通过代码绘制一系列图片,并且将这些图存储起来,然后通过代码将图片导入到一个GIF文件中。我这里直接给出代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
% To generate a gif files from plot

numx=100;
numt=20;
x=linspace(0,6*pi,numx);
t=linspace(0,10,numt);

%% 1. Directly export gif figures needed
%--------------------------------------------------------------
img_series=cell(numt,1); % 用一个Cell来存储fig对象

% Plot for different time
for l=1:numt

y=sin(x-t(l));
fig=figure();
plot(x,y,'r-');
xlabel('x');ylabel('y');
drawnow;
frame = getframe(fig);
img_series{l,1} = frame2im(frame);
close(fig);
end

% Export GIF
filename = 'Export_1.gif'; % Specify the output file name
for idx = 1:numt
[A,map] = rgb2ind(img_series{idx},256); %标准操作
if idx == 1
imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',0.5);
else
imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.5);
end
end

生成的gif如下所示

方法2:导入已有的一系列图片生成GIF

还有一些图片不是MATLAB生成的,而是本来就存在的,当进行合成的时候,需要我们先导入进来,主要是通过imread函数来导入图片。为了演示如何操作,我这里将绘制的图导出为png,然后再导入,再导出为gif。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

% To generate a gif files from plot

numx=100;
numt=20;
x=linspace(0,6*pi,numx);
t=linspace(0,10,numt);


%% Export png files and then load and exported into gif
% Create a series if png files
for l=1:numt
y=sin(x-t(l));
fig=figure();
plot(x,y,'r-');
xlabel('x');ylabel('y');

% Export PNG
fig_name=['fig_no_',num2str(l),'.png'];
print(fig_name,'-dpng');
close(fig);
end

% Load the png files and then export
delaytime=0.5; % unit is s
exportedGIFName='Export_2.gif';

for l=1:numt
a=imread(['fig_no_',num2str(l),'.png']);

% 因为GIF文件不支持三维数据,所以应调用 rgb2ind,使用颜色图 map 将图像中的 RGB 数据转换为索引图像A
[A, map] = rgb2ind(a,256);
if l==1
imwrite(A,map,exportedGIFName, 'gif','LoopCount',Inf,'DelayTime',delaytime);
else
imwrite(A,map,exportedGIFName, 'gif','WriteMode','append','DelayTime',delaytime);
end

end

结果与直接导出是一样的。