有没有办法使用 imagemagic / montage 来平铺循环动画 gif(与非动画混合)?
也就是说,我想在空间中连接动画,而不是在时间中。我意识到动画中的帧数及其持续时间可能会使两个动画无法整齐地组合在一起。但我不介意程序进行近似和猜测,以及延长/重复帧,只要所有帧都以某种方式存在即可。
我试过了
convert *.gif -append output.gif
和
montage *.gif -mode concatenate -tile x1 output.gif
但它们都将动画 gif 视为多个单独的非动画。
我想我可能会编写一个脚本,按帧将动画分开,根据需要重复/延长较短的循环以匹配最长的循环,重复非动画 gif,重复次数与最长动画中的帧数相同,将相应的帧拼接成单个大帧-append
,然后将这些大帧合并成一个大 gif。但如果这已经可以通过一些简单的命令实现,我不想重新发明轮子。
除了 imagemagick 之外,我当然也愿意接受其他免费选项。
答案1
听起来您想随时间匹配多个动画,但这需要一个程序来读取每个帧及其延迟,然后以某个周期性频率输出该帧,直到满足延迟。例如:1 帧,延迟 1 秒,您的“频率”为 100 毫秒,所以您想要以 100 毫秒的频率写出 10 帧?然后转换为线性蒙太奇?
这需要一个程序或庞大的脚本来执行这种处理,并且您必须定义您的“频率”(这里是 100 毫秒)。
但这很好用:(gifsicle 是一个包,montage 是 imagemagick 包的一部分)
gifsicle --unoptimize cool_animation.gif | \
montage -tile x1 - linear_frames.png
(为方便阅读,请换行)
第一行将传入的 gif 分解为单个帧(输出到标准输出),但图层已填充。最初,如果没有 --unoptimize 选项,它会给出第一帧,但后续帧仅包含每次更改的内容。制作奇怪的蒙太奇!
第二行构建线性输出,获取每帧图像(来自标准输入)并按照您指定的顺序排列它们。'x1' 沿水平线排列它们。
您可以用多个文件名(cool_animation.gif)甚至通配符 *.gif 来替换单个文件名 (cool_animation.gif)。
但我不确定这是否是你要找的东西。