将动画变形保存为MATLAB中的GIF文件

时间:2014-11-21 07:39:17

标签: matlab animation 3d gif image-effects

我终于可以设法获得涟漪效应了。我对其进行了动画处理,并希望将动画保存为GIF文件。

但我在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 个答案:

答案 0 :(得分: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有一个你可以使用的颜色属性。