在 MATLAB 中将动画变形另存为 GIF 文件

Posted

技术标签:

【中文标题】在 MATLAB 中将动画变形另存为 GIF 文件【英文标题】:Save animated warp as a GIF file in MATLAB 【发布时间】:2014-11-21 07:39:17 【问题描述】:

我终于可以得到连锁反应了。我为它制作了动画,并希望将动画保存到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

问题 1如何保存(或当前代码有什么问题)?

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

(例如view([0 45]) 和一点缩放)

谢谢,

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

但是使用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 具有您可以使用的颜色属性。

【讨论】:

谢谢,至少它保存了动画,+1 @Kamtal 是的,必须有更好的方法来做到这一点,但如果不使用close all,我就无法让它工作。我很想知道你是否想出一个比这个close all hack 更优雅的解决方案。 我希望如此,不过你的回答很棒。我认为问题出在warp,因为我的代码在plot 上运行良好。

以上是关于在 MATLAB 中将动画变形另存为 GIF 文件的主要内容,如果未能解决你的问题,请参考以下文章

怎样将matlab绘出的图形另存为高精度jpg图片?

用于在另存为对话框中将工作表另存为预命名文件的 VBA 代码

matlab-另存为代码

matlab中如何保将显示出来的图像保存

matlab中如何将输出的figure中的图像保存在我的文档中

将 Excel 图表复制并粘贴到 Word 中,无需链接或另存为 GIF