平铺动画 gif

tsb*_*lan 10 animated-gif imagemagick images

有什么方法可以使用 imagemagic / montage 来平铺循环的动画 gif(与非动画的混合)?

也就是说,我想在空间中而不是在时间上连接动画。我意识到动画中的帧数及其持续时间可能无法巧妙地组合两个动画。但是我对程序进行近似和猜测以及扩展/重复帧很好,只要所有帧都以某种方式存在。

我试过了

convert *.gif -append output.gif
Run Code Online (Sandbox Code Playgroud)

montage *.gif -mode concatenate -tile x1 output.gif
Run Code Online (Sandbox Code Playgroud)

但这些都将动画 gif 视为多个单独的非动画。

我想我可能可以编写一个脚本来按帧将动画分开,根据需要重复/扩展较短的循环以匹配最长的循环,重复非动画 gif 以获得最长动画中的尽可能多的帧,将相应的帧拼接在一起成单个大框架-append,然后将这些大框架组合成一个大 gif。但是,如果通过一些简单的命令已经可以做到这一点,我不想重新发明轮子。

除了 imagemagick 之外,我当然对其他免费选项持开放态度。

lor*_*nix 1

听起来您想随时间匹配多个动画,但这需要一个程序来读取每个帧及其延迟,然后以某个周期频率输出该帧,直到满足延迟。例如:1 帧,延迟 1 秒,而你的“频率”是 100 毫秒,所以你想以 100 毫秒的速度写出 10 帧?然后转换为线性蒙太奇?

这需要一个程序或庞大的脚本来执行这种处理,并且您必须定义“频率”(此处为 100 毫秒)。

但这效果很好:(gifsicle是一个包,montage是imagemagick包的一部分)

gifsicle --unoptimize cool_animation.gif | \
  montage -tile x1 - linear_frames.png
Run Code Online (Sandbox Code Playgroud)

(为便于阅读而断行)

第一行将传入的 gif 分成单独的帧(到标准输出),但填充了图层。最初,如果没有 --unoptimize 选项,它将给出第一帧,但后续帧仅包含每次更改的内容。专为奇怪的蒙太奇而设计!

第二行构建线性输出,获取每个帧图像(来自标准输入)并按照您指定的顺序排列它们。'x1' 将它们沿水平线排列。

您可以将单个文件名 (cool_animation.gif) 替换为多个文件名,甚至是通配符 *.gif。

我不确定这就是你要找的东西。