ImageMagick - 使用IM转换将2个GIF并排成GIF

Ben*_*enT 6 unix image imagemagick imagemagick-convert

我有2个长度相同的GIF.

我想把GIF放在一起,只有1个GIF同时播放.我试过用这个convert工具:

convert +append 1.gif1 2.gif output.gif
Run Code Online (Sandbox Code Playgroud)

然而,这似乎将所有图像混合在一起并且将尺寸改变为非常小.

我想我可以将每个图像附加在一起,然后从已经组合的图像中创建一个GIF.但是,当我尝试时,它不起作用:

convert -delay 15 -loop 0 1*.png 2*.png +append output.gif
Run Code Online (Sandbox Code Playgroud)

我有很多长名称的图像,我不想单独检查并附加新的命名约定.

Mar*_*ell 18

我没有2个相同长度的动画GIF,所以我只使用这个的两个副本:

在此输入图像描述

让我们看一下那里的帧,用这个:

identify 1.gif
1.gif[0] GIF 500x339 500x339+0+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[1] GIF 449x339 500x339+51+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[2] GIF 449x339 500x339+51+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[3] GIF 449x339 500x339+51+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[4] GIF 448x339 500x339+52+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[5] GIF 449x339 500x339+51+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[6] GIF 448x339 500x339+52+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[7] GIF 448x339 500x339+52+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[8] GIF 448x339 500x339+52+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[9] GIF 448x339 500x339+52+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[10] GIF 448x339 500x339+52+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[11] GIF 500x339 500x339+0+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[12] GIF 500x339 500x339+0+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[13] GIF 500x339 500x339+0+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[14] GIF 500x339 500x339+0+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[15] GIF 448x339 500x339+52+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[16] GIF 500x339 500x339+0+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
1.gif[17] GIF 500x339 500x339+0+0 8-bit sRGB 32c 508KB 0.000u 0:00.000
Run Code Online (Sandbox Code Playgroud)

嗯,18个不同大小的帧,这意味着我们需要使用-coalesce将部分帧重建为完整帧.

让我们复制并制作 2.gif

cp 1.gif 2.gif
Run Code Online (Sandbox Code Playgroud)

现在我们可以将两个GIF分成它们的组件框架,如下所示:

convert 1.gif -coalesce a-%04d.gif     # split frames of 1.gif into a-0001.gif, a-0002.gif etc
convert 2.gif -coalesce b-%04d.gif     # split frames of 2.gif into b-0001.gif, b-0002.gif etc
Run Code Online (Sandbox Code Playgroud)

现在让我们并排加入各个框架:

for f in a-*.gif; do convert $f ${f/a/b} +append $f; done
Run Code Online (Sandbox Code Playgroud)

请注意,这${f/a/b}是一个bash-ism,意思是"取f的值并用'b'替换字母'a'".

然后把它们重新组合在一起:

convert -loop 0 -delay 20 a-*.gif result.gif
Run Code Online (Sandbox Code Playgroud)

这看起来更长,更难,因为我试图解释这一切,但它看起来真的如此:

convert 1.gif -coalesce a-%04d.gif                         # separate frames of 1.gif
convert 2.gif -coalesce b-%04d.gif                         # separate frames of 2.gif
for f in a-*.gif; do convert $f ${f/a/b} +append $f; done  # append frames side-by-side
convert -loop 0 -delay 20 a-*.gif result.gif               # rejoin frames
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

注意这个概念代码,而不是生产质量.它不会删除它创建的临时文件,也不会携带原始GIF的帧间时间.如果你想获得原始帧速率,你可以像这样得到它们并将它们保存到一个数组中,并将延迟反馈到最后的重新动画命令中:

identify -format "%f[%s] %T\n" 1.gif
1.gif[0] 8
1.gif[1] 8
1.gif[2] 8
1.gif[3] 8
1.gif[4] 8
1.gif[5] 8
1.gif[6] 8
1.gif[7] 8
1.gif[8] 8
1.gif[9] 8
1.gif[10] 11
1.gif[11] 11
1.gif[12] 11
1.gif[13] 11
1.gif[14] 11
1.gif[15] 11
1.gif[16] 11
1.gif[17] 26
Run Code Online (Sandbox Code Playgroud)

此外,您可能需要两个动画之间的间隔,例如10个像素,您可以通过用以下代码替换循环convert内的命令来执行for此操作:

convert $f -size 10x xc:none ${f/a/b} +append $f
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • $ {f / a / b}的意思是*“采用`f`并将其中的`a`的所有实例替换为`b`” *,并且特定于`bash`(在Linux中)。您将需要找到Windows-y方法。 (2认同)