2014-11-21 152 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

相關問題