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


当我简单地将它们合并时,我就得到了这个结果:
convert gif_1.gif gif_2.gif out.gif

如您所见,第二个gif覆盖前一个gif。但是我想要一个连续的图。
发布于 2021-08-08 11:20:59
我可能会想出一个更好的版本,但就目前而言,我明白了这一点:
#!/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命令收集所有已发送的帧,并将其重新构建为一个序列。
https://stackoverflow.com/questions/68699841
复制相似问题