Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MatlabGUI中将动画另存为gif_Matlab_User Interface_Plot_Save_Gif - Fatal编程技术网

在MatlabGUI中将动画另存为gif

在MatlabGUI中将动画另存为gif,matlab,user-interface,plot,save,gif,Matlab,User Interface,Plot,Save,Gif,我正在尝试将动画保存为动画GIF。 我的绘图与下面给出的代码类似。 我也用动画线条创作了它 问题在于: 当我将我的图形定义为f=figure或figure(1)时,它正确地创建了.gif文件 但是,与使用“figure”命令在单独屏幕中绘制图形不同,我必须在MATLAB GUI轴上绘制轴作为给定图形 我试过:f=(handles.axes\u threeDOF),但当我使用此函数时,gif文件会创建屏幕的不同部分 你能帮我解决我的问题吗 numpoints = 500; x = linspa

我正在尝试将动画保存为动画GIF。
我的绘图与下面给出的代码类似。
我也用动画线条创作了它

问题在于:
当我将我的图形定义为
f=figure
figure(1)
时,它正确地创建了.gif文件

但是,与使用“figure”命令在单独屏幕中绘制图形不同,我必须在MATLAB GUI轴上绘制轴作为给定图形

我试过:
f=(handles.axes\u threeDOF),但当我使用此函数时,gif文件会创建屏幕的不同部分

你能帮我解决我的问题吗

numpoints = 500; 

x = linspace(0,4*pi,numpoints); 

y = square(x); 

y2 = 3 +square(x+1);

f = figure 

h = animatedline('Color','b','LineWidth',2); 

h2 = animatedline('Color','r','LineWidth',2);

grid on;

axis([0,12,-3,+6]) 

for k = 1:numpoints 

  addpoints(h,x(k),y(k)) 

  addpoints(h2,x(k),y2(k)) 

  drawnow  

  % Capture the plot as an image 

  frame = getframe(f); 

  im = frame2im(frame); 

  [imind,cm] = rgb2ind(im,256); 

  % Write to the GIF File 

  if k == 1 

      imwrite(imind,cm,'test.gif','gif', 'Loopcount',inf); 

  else 

      imwrite(imind,cm,'test.gif','gif','WriteMode','append'); 

  end 

end
我想创建此动画的gif:

但是它创建的函数是“f=(handles.axes\u threeDOF)”
我想我发现了问题:

f=handles.axes\u threeDOF
获取轴的句柄,而不是获取图形的句柄

由于我不知道您的身材名称,我无法给出完美的解决方案。
您可以尝试以下选项:

1.找到图形的名称,并使用类似以下内容:
f=handles.figure\u
2.使用
f=gcf(),假设只有一个数字。
3.使用
f=handles.axes\u threeDOF.Parent假设图形是轴的“父对象”


更新:

im=frame2im(帧),您需要裁剪图像的相关部分:
类似于:
im=im(36:884928:1800,:)

有比使用固定索引更稳健的解决方案,但它需要一些关于图形内部结构的知识


下面是重现问题的代码(而不是图形句柄,
f
获取轴句柄):


正确代码的结果(无
f=gca();
):

错误的结果代码(使用
f=gca();
)-获取轴句柄而不是图形句柄:

我想我发现了问题:

f=handles.axes\u threeDOF
获取轴的句柄,而不是获取图形的句柄

由于我不知道您的身材名称,我无法给出完美的解决方案。
您可以尝试以下选项:

1.找到图形的名称,并使用类似以下内容:
f=handles.figure\u
2.使用
f=gcf(),假设只有一个数字。
3.使用
f=handles.axes\u threeDOF.Parent假设图形是轴的“父对象”


更新:

im=frame2im(帧),您需要裁剪图像的相关部分:
类似于:
im=im(36:884928:1800,:)

有比使用固定索引更稳健的解决方案,但它需要一些关于图形内部结构的知识


下面是重现问题的代码(而不是图形句柄,
f
获取轴句柄):


正确代码的结果(无
f=gca();
):

错误的结果代码(使用
f=gca();
)-获取轴句柄而不是图形句柄:

你好,罗特姆!谢谢你的回答。当我在代码中添加f=figure和gca()时,它仍然会在不同的窗口中创建我的图形。我想在我的GUI轴(轴\三自由度)中看到这个图。实际上,我可以使用f=(handles.axes\u threeDOF)在GUI轴中绘制它。问题是将其导出为gif。它不能像那样保存整个轴,我想你不明白我的答案。使用
gca()
的代码会重现您的问题。使用
gca()
是错误的!!!你试过了吗?你有没有试过
f=handles.axes\u threeDOF.Parent
?我编辑了我的帖子,只是为了说明
f=gca()是一个“bug”。(我添加了“bug”来演示问题)。我还添加了两个结果,因此您可以看到
f=gca()给出的结果与您得到的结果相似。它不是“整个屏幕”,而是“整个图形”。如果图形最大化到“整个屏幕”,您将得到整个屏幕。。。我认为一个特别的解决方案是裁剪图像的相关部分。类似于:
im=im(36:884928:1800,:)你好!谢谢你的回答。当我在代码中添加f=figure和gca()时,它仍然会在不同的窗口中创建我的图形。我想在我的GUI轴(轴\三自由度)中看到这个图。实际上,我可以使用f=(handles.axes\u threeDOF)在GUI轴中绘制它。问题是将其导出为gif。它不能像那样保存整个轴,我想你不明白我的答案。使用
gca()
的代码会重现您的问题。使用
gca()
是错误的!!!你试过了吗?你有没有试过
f=handles.axes\u threeDOF.Parent
?我编辑了我的帖子,只是为了说明
f=gca()是一个“bug”。(我添加了“bug”来演示问题)。我还添加了两个结果,因此您可以看到
f=gca()给出的结果与您得到的结果相似。它不是“整个屏幕”,而是“整个图形”。如果图形最大化到“整个屏幕”,您将得到整个屏幕。。。我认为一个特别的解决方案是裁剪图像的相关部分。类似于:
im=im(36:884928:1800,:)
numpoints = 500;
x = linspace(0,4*pi,numpoints);
y = square(x);
y2 = 3 +square(x+1);
f = figure;
h = animatedline('Color','b','LineWidth',2);
h2 = animatedline('Color','r','LineWidth',2);
grid on;
axis([0,12,-3,+6])

for k = 1:numpoints
    addpoints(h,x(k),y(k))
    addpoints(h2,x(k),y2(k))
    drawnow

    %%% Test %%%
    %The following code demonstrates the problem.
    %f = gca(), returns a handle to the axes, instead of the figure.
    %You should remove the following line for the code to work properly... 
    f = gca();
    %%% Test %%%

    % Capture the plot as an image
    frame = getframe(f);
    im = frame2im(frame);
    [imind,cm] = rgb2ind(im,256);

    % Write to the GIF File
    if k == 1
        imwrite(imind,cm,'test.gif','gif', 'Loopcount',inf); 
    else
        imwrite(imind,cm,'test.gif','gif','WriteMode','append'); 
    end
end