【MATLAB】制作GIF动画
以官方例程为例%生成 y = x^n (n变化)图像的gif图x = 0:0.01:1;n = 1:0.5:5;nImages = length(n); %图像数即帧数fig = figure;for idx = 1:nImages %索引y = x.^n(idx);plot(x,y,'LineWidth',3)title(['y = x^n,n = ' num2str( n(idx)) ])dr
·
imwrite函数
将图像写入图形文件
以官方例程为例
%生成 y = x^n (n变化)图像的gif图
x = 0:0.01:1;
n = 1:0.5:5;
nImages = length(n); %图像数
fig = figure;
for idx = 1:nImages %索引
y = x.^n(idx);
plot(x,y,'LineWidth',3)
title(['y = x^n, n = ' num2str( n(idx)) ])
drawnow
%制作动画
frame = getframe(fig);
im{idx} = frame2im(frame);
[A,map] = rgb2ind(im{idx},256); %将 RGB 图像转换为索引图像 A。map 最多包含 n 个颜色。
if idx == 1
imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1);%'DelayTime'为每帧图像播放时间
else
imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',1);
end
end
官方解释:因为 GIF 文件不支持三维数据,所以应调用 rgb2ind
,使用颜色图 map
将图像中的 RGB 数据转换为索引图像 A
。要将多个图像添加到第一个图像中,请使用名称-值对组参数 'WriteMode','append'
调用 imwrite
。
help 查看函数作用
>> help drawnow
drawnow - 更新图窗并处理回调
此 MATLAB 函数 更新图窗并处理任何挂起的回调。如果您修改图形对象并且需要在屏幕上立即查看这次更新,请使用该命令。
>> help getframe
getframe - 捕获坐标区或图窗作为影片帧
此 MATLAB 函数 捕获显示在屏幕上的当前坐标区作为影片帧。F 是一个包含图像数据的结构体。getframe
按照屏幕上显示的大小捕获这些坐标区。它并不捕获坐标区轮廓外部的刻度标签或其他内容。
F = getframe
F = getframe(ax)
F = getframe(fig)
F = getframe(___,rect)
>> help frame2im
frame2im - 返回与影片帧关联的图像数据
此 MATLAB 函数 从单个影片帧 F 返回索引图像数据 X 和关联的颜色图 Map。输出 Map 是一个三列矩阵,其中,矩阵的每一行是一个 RGB
三元值,用于定义颜色图的一种颜色。如果该帧包含真彩色数据,则 Map 为空。函数 getframe 和 im2frame 创建影片帧。
[X,Map] = frame2im(F)
>> help imwrite
imwrite - 将图像写入图形文件
此 MATLAB 函数 将图像数据 A 写入 filename 指定的文件,并从扩展名推断出文件格式。imwrite
在当前文件夹中创建新文件。输出图像的位深度取决于 A 的数据类型和文件格式。对于大多数格式来说:
imwrite(A,filename)
imwrite(A,map,filename)
imwrite(___,fmt)
imwrite(___,Name,Value)
>> help rgb2ind
rgb2ind - 将 RGB 图像转换为索引图像
此 MATLAB 函数 使用最小方差量化和抖动将 RGB 图像转换为索引图像 X。map 最多包含 n 个颜色。n 必须小于或等于 65,536。
[X,map] = rgb2ind(RGB,n)
X = rgb2ind(RGB, map)
[X,map] = rgb2ind(RGB, tol)
[___] = rgb2ind(___,dither_option)
实例程序
%制作gif动图
clc,clear
x = [1,1,2,2,3,3,4,4,5,5];
y = [1,2,2,3,3,4,4,5,5,6];
f_h = figure(1);%第一个图窗
set(f_h,'Name','句柄绘图')%设置图窗名
set(f_h,'Color',[0.9 0.9 0.9])%设置图窗背景颜色
a_h=axes('Parent',f_h); %设置f_h为a_h的父级
set(a_h.Title,'String','阶梯图');%坐标区名字
set(a_h.XLabel,'String','X');%设置X坐标轴名字
set(a_h.YLabel,'String','Y');%设置Y坐标轴名字
set(a_h,'XLim',[0,8],'YLim',[0,8]);%设置坐标轴范围
set(a_h,'XTick',[0,1,2,3,4,5,6,7,8]);%设置坐标轴刻度
set(a_h,'XTickLabel',{'0','A','B','C','D','E','F','G','H'});%设置坐标轴刻度对应文本,文本数要与坐标轴刻度数相同
set(a_h,'YTick',[0,1,2,4,8]);
set(a_h,'YTickLabel',{'0','1','2','4','8'});
set(a_h,'XGrid','off','YGrid','on')%是否显示水平和竖直网格
line1_h=line('Parent',a_h); %曲线
line2_h=line('Parent',a_h); %动点
set(line1_h,'Color',[0 0.7 1],'LineStyle','-','LineWidth',2);%设置曲线颜色、线形、线宽、标记符号、标记符号尺寸
set(line2_h,'Color',[0 0.7 1],'Marker','o','MarkerSize',10);%设置曲线颜色、线形、线宽、标记符号、标记符号尺寸
set(line1_h,'XData',x,'YData',y); %设置坐标数据
set(line2_h,'XData',-1,'YData',0); %
filename_gif='ggg.gif';
for idx=1:length(x)
set(line2_h,'XData',x(idx),'YData',y(idx)); %
frame = getframe(f_h);%捕获坐标区或图窗作为影片帧
im{idx} = frame2im(frame);%返回与影片帧关联的图像数据
[A,map] = rgb2ind(im{idx},256); %将 RGB 图像转换为索引图像 A。map 最多包含 n 个颜色。
if idx ==1
imwrite(A,map,filename_gif,'gif','LoopCount',Inf,'DelayTime',0.4);%写入一帧图像,时间间隔0.4秒
else
imwrite(A,map,filename_gif,'gif','WriteMode','append','DelayTime',0.4);
end
pause(0.5)
end
saveas(gcf,'绘图例程1.png')
更多推荐
已为社区贡献1条内容
所有评论(0)