Сохранить анимацию в формате gif в Matlab GUI - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь сохранить анимацию как анимированный GIF.
Мой сюжет похож на приведенный ниже код.
Я тоже создал его с анимированной линией.

Проблема в том, что:
Когда я определил свою фигуру как f=figure или figure(1), она правильно создает файл .gif.

Однако вместо того, чтобы рисовать мою фигуру на отдельном экране с помощью команды "figure", я должен построить оси на MATLAB GUI как заданную фигуру.

Я пытался это сделать с помощью: f=(handles.axes_threeDOF);, но когда я использую эту функцию, gif-файл создает другую часть экрана.

Не могли бы вы помочь мне решить мою проблему?

numpoints = 500; 

x = linspace(0,4*pi,numpoints); 

y = square(x); 

y2 = 3 +square(x+1);

f = figure 

h = animatedline('Color','b','LineWidth',2); 

h2 = animatedline('Color','r','LineWidth',2);

grid on;

axis([0,12,-3,+6]) 

for k = 1:numpoints 

  addpoints(h,x(k),y(k)) 

  addpoints(h2,x(k),y2(k)) 

  drawnow  

  % Capture the plot as an image 

  frame = getframe(f); 

  im = frame2im(frame); 

  [imind,cm] = rgb2ind(im,256); 

  % Write to the GIF File 

  if k == 1 

      imwrite(imind,cm,'test.gif','gif', 'Loopcount',inf); 

  else 

      imwrite(imind,cm,'test.gif','gif','WriteMode','append'); 

  end 

end

Я хочу создать gif этой анимации:
enter image description here

Но он создается как задано ниже с помощью этой функции "f = (handles.axes_threeDOF)" enter image description here

1 Ответ

0 голосов
/ 01 ноября 2019

Я думаю, что нашел проблему:

f = handles.axes_threeDOF получает дескриптор осей вместо того, чтобы получить дескриптор фигуры .

Поскольку я не знаю имени вашей фигуры, я не могу дать идеальное решение.
Вы можете попробовать следующие варианты:

1.Найдите имя цифра и используйте что-то вроде: f = handles.figure_threeDOF;
2. Используйте f = gcf();, предполагая, что есть только одна цифра.
3. Используйте f = handles.axes_threeDOF.Parent;, предполагая, что фигура является "Родителем"осей.


Обновление:

После im = frame2im(frame); необходимо обрезать соответствующую часть изображения:
Что-то вроде: im = im(36:884, 928:1800, :);

Есть более надежное решение, чем использование фиксированных индексов, но оно требует некоторых знаний о внутренней структуре фигуры.


Вот код, который воспроизводит проблему (вместо дескриптора фигуры f получает дескриптор оси):

numpoints = 500;
x = linspace(0,4*pi,numpoints);
y = square(x);
y2 = 3 +square(x+1);
f = figure;
h = animatedline('Color','b','LineWidth',2);
h2 = animatedline('Color','r','LineWidth',2);
grid on;
axis([0,12,-3,+6])

for k = 1:numpoints
    addpoints(h,x(k),y(k))
    addpoints(h2,x(k),y2(k))
    drawnow

    %%% Test %%%
    %The following code demonstrates the problem.
    %f = gca(), returns a handle to the axes, instead of the figure.
    %You should remove the following line for the code to work properly... 
    f = gca();
    %%% Test %%%

    % Capture the plot as an image
    frame = getframe(f);
    im = frame2im(frame);
    [imind,cm] = rgb2ind(im,256);

    % Write to the GIF File
    if k == 1
        imwrite(imind,cm,'test.gif','gif', 'Loopcount',inf); 
    else
        imwrite(imind,cm,'test.gif','gif','WriteMode','append'); 
    end
end

Результат правильного кода (без f = gca();):
enter image description here

Результат неправильный код (с f = gca();) - получение дескриптора осей вместо дескриптора фигуры:
enter image description here

...