MATLAB绘制动画(五)GIF

文章介绍了如何使用MATLAB生成GIF动画图像,包括清除多余数据,设置坐标轴属性,绘制图形,使用getframe存储帧,通过rgb2ind转换为索引图像,最后用imwrite函数保存为GIF格式,并设置了延迟时间和循环次数。示例代码展示了FFT变换的动态过程。
摘要由CSDN通过智能技术生成

GIF这个文件大家就比较熟悉了,我们通常当做表情包的动图一般都是用GIF格式。

这是因为GIF格式的文件比较小,传输速度快。

用MATLAB生成GIF图像同样需要将图像保存下来,通过循环展示动画

代码如下:

clc;
clear;
close all;
set(gca,'NextPlot','replaceChildren','box','off','color','w');

numFrames = 5;
for k = 1:numFrames
    plot(fft(eye(k+16)));
    axis([-1 1 -4 1]);
    axis equal
    f(k) = getframe(gcf);
end
movie(f,5)

animated(1,1,1,numFrames) = 0;
for k = 1:numFrames
    if k == 1
        [animated,cmap] = rgb2ind(f(k).cdata,256,'nodither');
    else
        animated(:,:,1,k) = rgb2ind(f(k).cdata,cmap,'nodither');
    end
end
filename = 'fftmov.gif';
imwrite(animated,cmap,filename,'DelayTime',0.5,'LoopCount',5);
web(filename)

结合上一篇中对于avi的讲解,上述代码很好理解

首先,第一部分清楚多余的数据,并对坐标轴进行设置。

具体来说,我们设置坐标轴‘NextPlot’属性,使得不会随着图形的刷新发生变化。

box属性决定坐标轴会不会包括边框,这里取消了边框的显示

color属性决定坐标轴的颜色

接下来的一段,我们在图窗中绘制了图形,并使用getframe函数将图窗中的图形存储在矩阵中,作为一帧

最后一段,我们生成GIF文件并储存。

animated函数:

我们之前用跟它很像的animatedline来生成质点动画:

an = animatedline 创建一根没有任何数据的动画线条并将其添加到当前坐标区中。通过使用

addpoints 函数循环向线条中添加点来创建动画。

可以联想到,这应该也是创建一个图形。

在存储图形时,我们用到了rgb2ind函数的下列功能:

[X,cmap] = rgb2ind(RGB,Q) 使用具有 Q 种量化颜色的最小方差量化法并加入抖动,将 RGB 图像转换为索引图像 X,关联颜色图为 cmap。

X = rgb2ind(RGB,inmap) 使用逆颜色图算法并加入抖动,将 RGB 图像转换为索引图像,指定的颜色图为 inmap。

总的来说,我们把从图窗中直接导出的图像,转化为索引图像。

最后是:

imwrite(animated,cmap,filename,'DelayTime',0.5,'LoopCount',5);

我们将索引图像数组animated、对应的颜色图cmap、储存的文件名filename输入给函数,并设置每一帧的延迟时间为0.5s,重复次数为5次。

% imwrite(A,filename)
% imwrite(A,map,filename)

imwrite(A,map,filename) 将 A 中的索引图像及其关联的颜色图 map 写入由 filename 指定的文件。

默认的情况下,重复次数是inf

如果上述代码实现时间较长,可以用生成AVI的简易图形测试:

clc;
clear;
close all;
fig = figure ;
n = 100;
t = 0:2*pi/n:2*pi;
x = cos(t);
y = sin(t);
for k = 1:n
    x(k) = cos(t(k));
    y(k) = sin(t(k));
    H = plot(x,y,x(k),y(k),'or',x(k),-y(k),'ob');
    axis equal
    grid on
    MOV(k) = getframe(fig);
end
animated(1,1,1,n) = 0;
for k = 1:n
    if k == 1
        [animated,cmap] = rgb2ind(MOV(k).cdata,256,'nodither');
    else
        animated(:,:,1,k) = rgb2ind(MOV(k).cdata,cmap,'nodither');
    end
end
filename = 'fftmov.gif';
imwrite(animated,cmap,filename,'DelayTime',0.5,'LoopCount',5);
web(filename)

 可以得到:

 

参考《高等光学仿真——光波导、激光》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

matlab练习生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值