【问题标题】:Why do my .GIFs written with MatLab always skip the second image frame in the first display loop?为什么我用 MatLab 编写的 .GIF 总是跳过第一个显示循环中的第二个图像帧?
【发布时间】:2019-02-10 07:08:40
【问题描述】:

考虑以下 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 时是否看到相同的问题,如果您愿意知道它的来源。

仅供参考:我在 Windows 机器上使用 Matlab R2018a。

编辑:这是我创建的示例图像:

【问题讨论】:

  • 你能分享它创建的 GIF 吗?
  • 当然,我加了一个。可能需要刷新页面才能看到我指的是什么,因为它只发生在显示的第一个循环中。
  • ImageMagick 分析你的 GIF 文件显示它有 4 帧,每帧有 100 的延迟。GIF 中延迟的默认单位是 "厘秒”,因此四个帧中的每一个都应显示 1 秒。
  • 感谢您的帮助,马克。我想这意味着问题出在 Windows 用于打开 GIF 的本机应用程序中。
  • 不确定它的真正含义 :-) 尝试在 Firefox、Safari 和 Chrome 中查看文件,看看它在那里的样子。在我的 Mac 上看起来不错。在动画 GIF 方面,Windows 的历史确实很差 - Internet Explorer 6 一次忽略了 6 厘秒以下的延迟,如果任何单个帧的大小与第一个帧的大小不同,IE8 就会崩溃。

标签: matlab animated-gif


【解决方案1】:

只是为未来的读者总结的 cmets...

您可以在命令行中使用 ImageMgick 检查动画 GIF 中的延迟和细节,如下所示:

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

此命令类似 - 在 Windows 上使用 FINDSTR 代替 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


请注意,某些应用程序会错误地显示动画 GIF,因此请尝试在网络浏览器中使用 Open->File 进行检查。试试 Chrome、Firefox、Opera、Safari 等。


如果您在将 GIF 传递给同事并被理解时确实遇到问题,您可以用这样的动画制作卡通片:

magick input.gif -coalesce +append result.gif

或者,您可以像这样在网格上制作蒙太奇:

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

【讨论】:

    猜你喜欢
    • 2019-05-10
    • 2017-05-02
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多