matlab 和 Octave 中 gif 图的绘制 - (包含正弦函数的绘制测试)

在使用 matlab 或者 octave 时,有时会需要绘制动图(.gif)并保存,这里对动图(其他图片格式,同理)进行阐述。

有的时候,gif 有助于对问题的理解,下面就介绍一下如何利用Matlab来绘制gif图。主要是源代码及结果展示,代码里面有注释,根据自己的需求,进行修改即可。

一、 绘制 正弦函数(y = sin(x))的增长过程

clc, clear, close all;
f_num = 1;  % 帧数索引
figure;

for k = 1 : 1 : 100 % 选取的动态参数
    x = -pi : 0.1 : pi*k;
    y = sin(x);
    % 绘制正弦函数
    axis([-pi 100*pi -1 1]);
    plot(y);
    title('y = sin(x)');
    
    F = getframe(gcf);     % 截取帧
    I = frame2im(F);       % 从单个影片帧F返回真色彩(RGB)图像
    
    [I, map] = rgb2ind(I); % 使用具有256种量化银色的最小方差量化法并加入抖动,将RGB图像转换成索引图像I,关联颜色图为map。
    
    if f_num == 1          % 如果不存在该图片,则创建
        imwrite(I, map, 'sinFunc.gif', 'gif', 'Loopcount', inf, 'DelayTime', 0.3);
    else                   % 如果已经存在该gif图,则写入数据(此时使用 append 追加模式)
        imwrite(I, map, 'sinFunc.gif', 'gif', 'WriteMode', 'append', 'DelayTime', 0.3);
    end
    
    f_num = f_num + 1;  % 索引帧数+1
end

结果:
在这里插入图片描述

二 表现绘图过程,即图形的增长过程

参考内容:
Matlab绘制动态 .gif 图

注:

以下程序均需另存为 m 文件运行,运行后在Matlab的当前路径下,可以看到相应的 gif 文件。
有的 gif 图片是由多个 gif 图片拼接而成的,拼接时所用的软件是 ulead gif animator, 可自行搜索下载。
所测试的 Matlab版本是 R2016b,太低的版本可能没法运行

%适用于在一幅图中表现给图过程,即图形的增长过程

%主要用来绘制三维的欧拉公式
clc;clear;clf;close all;

%获得数据
tmax = 4*pi;
t = 0:0.01:tmax;
tmp = exp(1i*t);
x = real(tmp);
y = imag(tmp);
[a,b] = size(x);
y1 = zeros(a,b) ;
x1 = zeros(a,b);

%确定首幅图的样式,并指定标题,坐标轴标题等样式
plot3(x(1,1),t(1,1),y(1,1),'black');
hold on
plot3(x(1,1),t(1,1),y1(1,1),'blue');
plot3(x1(1,1),t(1,1),y(1,1),'r');
axis([-1,1,0,tmax,-1,1])
str = ['$${e^{it}} = \cos t + i\sin t $$',char(13,10)','created by Lijunjie!'];
title({str},'interpreter','latex')
xlabel('实轴');
ylabel('时间轴');
zlabel('虚轴');
grid on;
set(gcf,'Position',[0,0,600,600], 'color','w');
set(gca,'ydir','reverse')   %反转坐标轴

%确保图像在采集的过程中包括坐标轴及标题
ax = gca;
ax.Units = 'pixels';
pos = ax.Position;
ti = ax.TightInset;
rect = [-ti(1), -ti(2), pos(3)+ti(1)+ti(3), pos(4)+ti(2)+ti(4)];

%在指定的范围内获得图像文件
frame = getframe(ax,rect);
im=frame2im(frame);

%创建gif文件,指定其样式,写入首帧图像
k = 1;
%用胞元存储采集到的图像,方便后面反转图像用
[I{k},map{k}]=rgb2ind(im,256);
imwrite(I{k},map{k,1},'mygif.gif','gif','Loopcount',Inf,'DelayTime',0.2);
 k = k + 1;
 
 %画图并采集到gif中
steptmp = 20;   %每幅图要画的点数
i = steptmp;
while i < (b-1)
    x_1 = x(1,(i-steptmp+1):i+1);
    t_1 = t(1,(i-steptmp+1):i+1);
    y_1 = y(1,(i-steptmp+1):i+1);
    y1_1 = y1(1,(i-steptmp+1):i+1);
    x1_1 = x1(1,(i-steptmp+1):i+1);
    plot3(x_1,t_1,y_1,'black');
    hold on
    plot3(x_1,t_1,y1_1,'blue');
    plot3(x1_1,t_1,y_1,'r');
    
    %下面是制作gif的主要代码,除了调节间隔时间外,一般不需要改动 
    ax = gca;
    ax.Units = 'pixels';
    pos = ax.Position;
    ti = ax.TightInset;
    rect = [-ti(1), -ti(2), pos(3)+ti(1)+ti(3), pos(4)+ti(2)+ti(4)];
    frame = getframe(ax,rect);
    im=frame2im(frame);
    [I{k},map{k}]=rgb2ind(im,256);
    %写入模式为“追加”模式
    imwrite(I{k},map{k},'mygif.gif','gif','WriteMode','append','DelayTime',0.1);  
    k = k + 1;
    
    i = i + steptmp;
end

%将图像按相反的顺序再写入到gif中
for i = (k-1):-1:1
imwrite(I{i},map{i},'mygif.gif','gif','WriteMode','append','DelayTime',0.1);  
end

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值