2014-11-21 101 views
0

我终于可以设法获得连锁效果。我给它制作了动画并想将动画保存到GIF文件中。将生成的动画作为GIF文件保存在MATLAB中

但我在gif文件中得到一个固定的图像。

该动画在MATLAB中运行良好,但我不知道为什么它不会被保存。

im = imread('peppers.png'); 
[m,n,~] = size(im); 
n = linspace(-4 * pi,4 * pi,n); 
m = linspace(-4 * pi,4 * pi,m); 
[X,Y] = meshgrid(m,n); 
d = (X .^ 2 + Y .^ 2) .^ .5; 
d = d/max(d(:)); 
d = (d - .5) * 2 * pi; 
j = 1; 
figure(1); 
for i = 0 : .2 : 2 * pi 
    Z = cos(2 * d + i) .* exp(-.01 .* d); 
    h = warp(X,Y,Z,im); 
    axis equal; axis off; 
    f = getframe; 
    [I,~] = frame2im(f); 
    [I,cm] = rgb2ind(I,256); 
    if j == 1 
     imwrite(I,cm,'B.gif','gif', 'Loopcount',inf); 
    else 
     imwrite(I,'B.gif','gif','WriteMode','append','DelayTime',1/24); 
    end 
    j = 0; 
end 

enter image description here

问题1我如何保存它(或什么是当前的代码问题)?

问题2如何以没有白色背景的方式保存它?

(例如用view([0 45])和一点点变焦)

感谢,

编辑感谢@ Ayb4btu,我做了一些改进,

enter image description here

但是使用close all放缓事情下来,有时甚至getframe捕获我的桌面!

回答

1

出于某种原因,imwrite不喜欢如何更新图形。下面的不雅代码工作通过关闭图和绘图一个新问题:

clear all, close all, clc 

I = imread('peppers.png'); 
[m,n] = size(I); 
n = linspace(-4 * pi,4 * pi,n); 
m = linspace(-4 * pi,4 * pi,m); 
[X,Y] = meshgrid(m,n); 
d = (X .^ 2 + Y .^ 2) .^ .5; 
d = d/max(d(:)); 
d = (d - .5) * 2 * pi; 
j = 1; 

for p = 0 : .2 : 4 * pi 
    figure(1) 
    Z = cos(2 * d + p) .* exp(-.01 .* d); 
    h = warp(X,Y,Z,I); 
    axis equal; axis off; 

    frame = getframe(1); 
    im = frame2im(frame); 
    [A,map] = rgb2ind(im,256); 

    if j == 1 
     imwrite(A,map,'B.gif','gif', 'Loopcount',Inf,'DelayTime',1/24); 
    else 
     imwrite(A,map,'B.gif','gif','WriteMode','append','DelayTime',1/24); 
    end 

    j = 0; 
    close all 
end 

以此为基础,你也许能找出问题所在。

至于你的问题2,这段代码使用了图的背景颜色,尽管我相信imwrite有一个你可以玩的颜色属性。

+0

谢谢,至少它节省了动画,+1 – Rashid 2014-11-21 09:36:37

+0

@Kamtal是的,必须有一个更好的方式来做到这一点,但我不能不使用'close all'工作。如果你想出一个更优雅的解决方案,而不是这个“关闭所有”黑客,我会很感兴趣。 – Ayb4btu 2014-11-21 10:04:01

+0

我希望如此,你的回答虽然很棒。我认为问题出在'warp'上,因为我的代码和'plot'一起工作正常。 – Rashid 2014-11-21 10:07:04

相关问题