【MATLAB】制作GIF动画

本文通过一个官方示例详细介绍了如何利用MATLAB的imwrite、getframe、frame2im和rgb2ind等函数制作GIF动态图像。首先生成y=x^n的图像序列,然后利用getframe捕获图像,通过frame2im和rgb2ind转换为索引图像,最后使用imwrite写入GIF文件。此外,还展示了如何调整图像延迟时间和循环次数。
摘要由CSDN通过智能技术生成

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')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嗑药的皮皮虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值