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 == 1imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1);%'DelayTime'为每帧图像播放时间elseimwrite(A,map,filename,'gif','WriteMode','append','DelayTime',1);endend
官方解释:因为 GIF 文件不支持三维数据,所以应调用rgb2ind
,使用颜色图map
将图像中的 RGB 数据转换为索引图像A
。要将多个图像添加到第一个图像中,请使用名称-值对组参数'WriteMode','append'
调用imwrite
。
help 查看函数作用
>> help drawnowdrawnow - 更新图窗并处理回调此 MATLAB 函数 更新图窗并处理任何挂起的回调。如果您修改图形对象并且需要在屏幕上立即查看这次更新,请使用该命令。>> help getframegetframe - 捕获坐标区或图窗作为影片帧此 MATLAB 函数 捕获显示在屏幕上的当前坐标区作为影片帧。F 是一个包含图像数据的结构体。getframe按照屏幕上显示的大小捕获这些坐标区。它并不捕获坐标区轮廓外部的刻度标签或其他内容。F = getframeF = getframe(ax)F = getframe(fig)F = getframe(___,rect)>> help frame2imframe2im - 返回与影片帧关联的图像数据此 MATLAB 函数 从单个影片帧 F 返回索引图像数据 X 和关联的颜色图 Map。输出 Map 是一个三列矩阵,其中,矩阵的每一行是一个 RGB三元值,用于定义颜色图的一种颜色。如果该帧包含真彩色数据,则 Map 为空。函数 getframe 和 im2frame 创建影片帧。[X,Map] = frame2im(F)>> help imwriteimwrite - 将图像写入图形文件此 MATLAB 函数 将图像数据 A 写入 filename 指定的文件,并从扩展名推断出文件格式。imwrite在当前文件夹中创建新文件。输出图像的位深度取决于 A 的数据类型和文件格式。对于大多数格式来说:imwrite(A,filename)imwrite(A,map,filename)imwrite(___,fmt)imwrite(___,Name,Value)>> help rgb2indrgb2ind - 将 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,clearx = [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 ==1imwrite(A,map,filename_gif,'gif','LoopCount',Inf,'DelayTime',0.4);%写入一帧图像,时间间隔0.4秒elseimwrite(A,map,filename_gif,'gif','WriteMode','append','DelayTime',0.4);endpause(0.5)endsaveas(gcf,'绘图例程1.png')