Matlab:如何将动态图保存为gif

5
考虑以下绘制摆线动画图的函数:
function animate1()
    clear, clc

    R = 1; 
    na = -pi/2; 
    t = 0:0.05:6;
    v = 4; 

    for i = 1:length(t)
        x0 = v*t(i); 
        y0 = R;
        na = -v*t(i)/R; 
        fi = linspace(na,na+2*pi,100); 
        x = x0 + R*cos(fi); 
        y = y0 + R*sin(fi);

        xc(i) = x0 + R*cos(na);
        yc(i) = y0 + R*sin(na);

        plot(x,y,'b',... 
            xc(i),yc(i),'*m',... 
            xc,yc,'r') 
        axis([-1 25 0 1.5])
        axis equal
        pause(0.01)
    end

是否有可能修改代码,使其输出动画图形,例如 gif 格式?

提前感谢您!

1个回答

8
是的,imwrite 支持动态 GIF。就像对于 AVI 视频一样,您可以通过 getframe 逐帧获取图像。然后将它们传递给 imwrite,但对于 GIF,您必须先将它们从 RGB 转换为 256 色彩地图。像这样:
for i = 1:nFrames

    % draw stuff

    frame = getframe(gcf);
    img =  frame2im(frame);
    [img,cmap] = rgb2ind(img,256);
    if i == 1
        imwrite(img,cmap,'animation.gif','gif','LoopCount',Inf,'DelayTime',1);
    else
        imwrite(img,cmap,'animation.gif','gif','WriteMode','append','DelayTime',1);
    end
end

请查看openExample('matlab/WriteAnimatedGIFExample')doc imwrite获取更多信息。

但是在 frame = getframe(gcf); 中,gcf 是什么? - Eugeny89
1
@Eugeny89 gcf 返回当前图形句柄。请查看文档 - codeaviator
没错,谢谢@Cebri,gcf是get current figure的缩写。因此,getframe(gcf)将获取整个当前图形。如果您只想抓取当前轴(即不包括图例、刻度标记等),还可以使用getframe(gca)gca= get current axis)。 - Florian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接