首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个接一个地合并两个gifs,保留第一个gif的最后一个帧作为第二个gif的背景。

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

Stack Overflow用户
提问于 2021-08-08 10:22:38
回答 1查看 117关注 0票数 1

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

gifs的例子:

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

代码语言:javascript
复制
convert gif_1.gif gif_2.gif out.gif

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-08 11:20:59

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

代码语言:javascript
复制
#!/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命令,与|连接在一起,即:

代码语言:javascript
复制
command1 | command2

第一个命令实际上是{...}内部的一个复合命令,即:

代码语言:javascript
复制
{ command1A; command1B; command1C; } | command2

正在通过管道的东西是一个MIFF,它是一个Magick图像文件格式,它能够保存多个图像-在本例中包含多个GIF帧。

所以,你可以这样读:

代码语言:javascript
复制
{ send a MIFF; send a MIFF; send a MIFF; } | assemble MIFFs

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

第二个magick命令提取第二个GIF的第一个框架,在背景上组合它并将其作为MIFF发送到管道中。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68699841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档