I have 2 GIFs that are the same length.
I want to put the GIFs beside each other to have 1 GIF with both playing at the same time. I have tried to use the convert
tool with:
convert +append 1.gif1 2.gif output.gif
However, this seems to blend all the images together and changes the size to be extremely small.
I was thinking that I could append each image together and then create a GIF out of those already combined images. However it did not work when I tried:
convert -delay 15 -loop 0 1*.png 2*.png +append output.gif
I have a lot of images with long names and I do not want to have to go through individually and append each figure with new naming conventions.
Merging GIFs side by side To put 2 GIF images side by side in one file, head over to our GIF combine tool. Upload the images, drag and drop them to right or left position and click "Combine".
Do you have multiple animated GIFs that you want to combine? You can use VEED's GIF maker and editor to merge them and create fun new animated GIF images! Upload your GIF files and trim, split, and join them to create a fun new animated image. You can do it all on your browser.
I don't have 2 animated GIFs of the same length, so I'll just use two copies of this one:
Let's look at the frames in there, with this:
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
Mmmm, 18 frames with different sizes, that means we need to use -coalesce
to rebuild partial frames into full ones.
Let's copy that and make 2.gif
cp 1.gif 2.gif
Now we can split the two gifs into their component frames, like this:
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
Now let's join the individual frames side-by-side:
for f in a-*.gif; do convert $f ${f/a/b} +append $f; done
Note that ${f/a/b}
is a bash-ism meaning "take the value of f and replace the letter 'a' with 'b'".
And put them back together again:
convert -loop 0 -delay 20 a-*.gif result.gif
That looks longer, and harder, than it is because I tried to explain it all, but it looks like this really:
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
Note that this conceptual code, not production quality. It doesn't remove the temporary files it creates, nor does it carry the inter-frame time forward from the original GIFs. If you want to get the original frame rate you could get them like this and save them into an array and feed the delays back into the re-animation command at the end:
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
Also, you may want a spacer between the two animations, say 10 pixels, which you can do by replacing the convert
command inside the for
loop with this one:
convert $f -size 10x xc:none ${f/a/b} +append $f
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With