Почему мои файлы .GIF, написанные с помощью MatLab, всегда пропускают второй кадр изображения в первом цикле отображения? - PullRequest
0 голосов
/ 05 сентября 2018

Рассмотрим следующие MCVE:

B = 50 - randi(100,100,100,4);

% Show each of the 4 layers of A for 0.50 seconds each, and save image frames:
fig=figure();
for idx = 1:size(B,3)
    imagesc( B(:,:,idx) ); title(num2str(idx)); caxis([-50 50]); drawnow; 
    frame = getframe(fig);
    img{idx} = frame2im(frame);
    pause(0.50);
end

% Write a .gif file, show each image 1 second in infinite loop.
filename = 'whatsgoingon.gif'; dlyt = 1;
for idx=1:length(img)
    [A,map]=rgb2ind(img{idx},256);
    if idx==1;  imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',dlyt);
    else;       imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',dlyt);
    end
end

Каждое изображение показывает слой куба B. Я написал некоторый код, чтобы сделать из него файл .gif, чтобы его было легче распространять. Проблема, с которой я сталкиваюсь, заключается в следующем: каждый раз, когда я открываю файл .gif, он пропускает второй кадр (т. Е. Связанный с B (:,:, 2)) в первом цикле показа. По сути, .gif показывает следующие кадры в хронологическом порядке:

1, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 и т. Д.

Это не огромная проблема, просто немного смущает, когда я делюсь одними результатами с другими. Кажется, я не могу найти ни одной темы по аналогичной проблеме (ни здесь, ни на веб-сайте Matlab), поэтому мне было бы очень любопытно услышать, если вы видите ту же проблему, когда вы делаете GIF с использованием приведенного выше кода, и если бы вы есть идеи, откуда он взялся.

К вашему сведению: я использую Matlab R2018a на компьютере с Windows.

РЕДАКТИРОВАТЬ: вот пример изображения, которое я создал:

here's a gif I create in this manner:

1 Ответ

0 голосов
/ 05 сентября 2018

Просто краткое изложение комментариев для будущих читателей ...

Вы можете проверить задержки и детали в анимированном GIF-файле с помощью ImageMgick в командной строке следующим образом:

magick identify -format "%f[%s] %T\n" matlab.gif 

Пример вывода

matlab.gif[0] 100      <--- this frame has a 100 centisecond delay
matlab.gif[1] 100
matlab.gif[2] 100
matlab.gif[3] 100

Эта команда похожа - используйте FINDSTR в Windows вместо grep:

magick identify -verbose matlab.gif | grep Delay
Delay: 100x100
Delay: 100x100
Delay: 100x100
Delay: 100x100

Если вы хотите отладить анимированный GIF, но он слишком быстр, чтобы увидеть, вы можете сбросить все тайминги - скажем, до 3 с на кадр - как это:

magick input.gif -coalesce -set delay 300 slooooow.gif

enter image description here


Обратите внимание, что некоторые приложения некорректно отображают анимированные GIF-изображения, поэтому попробуйте использовать Open -> File в веб-браузере для проверки. Попробуйте Chrome, Firefox, Opera, Safari и т. Д.


Если у вас действительно возникают проблемы с передачей GIF-файлов коллегам и пониманием, вы можете сделать мультфильм из анимации, подобной этой:

magick input.gif -coalesce +append result.gif

enter image description here

Или вы можете сделать монтаж на сетке следующим образом:

magick input.gif -coalesce miff:- | magick montage -geometry +10+10 -  result.gif

enter image description here

...