一个接一个地合并两个 gif,保留第一个 gif 的最后一帧作为第二个 gif 的背景

Merge two gifs one after another, preserving last frame of the first gif as background for second one

我需要合并两个(随后很多)具有透明背景的 gif。在播放第二个 gif 时,第一个 gif 的最后一帧应该保持可见。也就是说,第二个gif应该补充,继续第一个。结果我想得到一个连续的图。

gif 示例:

当我简单地合并它们时,我得到了这个结果:

convert gif_1.gif gif_2.gif out.gif

如您所见,第二个 gif 覆盖了前一个。但是我想得到一个连续的图。

我可能会想出一个更好的版本,但目前,我明白了:

#!/bin/bash

{
   magick 1.gif -coalesce -write miff:- -delete 0--2 bg.gif
   magick 2.gif[0] bg.gif -compose srcover -composite miff:-
   nFrames=$(magick identify 2.gif | wc -l)
   for ((frame=1;frame<$nFrames;frame++)) ; do
     magick 2.gif -coalesce -swap 0,$frame -delete 1--1 bg.gif -compose srcover -composite miff:-
   done
} | magick miff:- result.gif


作为解释...

整个过程是一对 bash 命令,与 | 一起通过管道传输,即:

command1 | command2

第一条命令实际上是{...}里面的复合命令,即:

{ command1A; command1B; command1C; } | command2

通过管道传输的是 MIFF,它是一种 Magick 图像文件格式,能够保存 多张 张图片 - 在本例中为多张 GIF 帧。

因此,您可以这样阅读:

{ send a MIFF; send a MIFF; send a MIFF; } | assemble MIFFs

第一个 magick 命令分离出第一个 GIF 的帧,将它们发送到管道并删除除最后一帧以外的所有帧,它保存为第二个 GIF 帧的背景。

第二个 magick 命令提取第二个 GIF 的第一帧,将其合成在背景上并将其作为 MIFF 通过管道发送。

下一个命令计算第二个 GIF 中的帧数,然后迭代它们。对于第二个 GIF 中的每一帧,我将该帧移动到位置零,然后删除所有其他帧,只留下选定的帧,然后将其合成在背景上并将结果发送到管道。

末尾的最后一个 magick 命令收集所有已发送的帧并将其重建为单个序列。