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

+0

@Kamtal Да, должен быть лучший способ сделать это, но я не могу заставить его работать, не используя 'close all'. Мне было бы интересно услышать, если вы придумаете более элегантное решение, чем этот «закрыть все». – Ayb4btu

+0

Надеюсь, ты ответишь. Я думаю, проблема связана с 'warp', потому что мой код отлично работает с' plot'. – Rashid