在MatlabGUI中将动画另存为gif
我正在尝试将动画保存为动画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
我的绘图与下面给出的代码类似。
我也用动画线条创作了它 问题在于:
当我将我的图形定义为
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