Combine multiple images using ImageMagick
I would like to combine multiple images into one image using ImageMagick. To explain a little better, I want the result to look similar to this:
That is, I have a number of screenshots, and I want to turn them into one image with the original images on top of each other.
By Googling, I have come across the 'composite' command, but I don't know if, and in that case how to use it to get the result I want.
Solution 1:
For any number of input files
named in-<something>.jpg
:
convert -append in-*.jpg out.jpg
In order to have specific files appended, or skip numbers instead of getting the full "glob", you can mention the input files explicitly and put the append
command afterwards
convert in-1.jpg in-5.jpg in-N.jpg +append out-in1-plus-in5-and-inN.jpg
You can use -append
(instead of +append
) for vertical paste-up.
Or:
montage -mode concatenate -tile 1x in-*.jpg out.jpg
will also create a file out.jpg
that contains a vertical concatenation of the source images.
convert
For simple concatenation in a single row or column, the append
option of the convert
tool is sufficient. Note that -append
concatenates all images vertically, creating one column with n rows,
and +append
concatenates horizontally, creating one row with n columns.
(See ImageMagick: Command-line Options.)
montage
To get finer control over the layout, we would need the montage
tool. montage -mode concatenate
will glue the input images together like the append
option and -tile 1x
controls the layout to be applied.
tile
follows the format columns×rows, but either side may be missing and montage
will figure out how to meet the constraints.
We're using 1x
(exactly one column with any number of rows) here to get the same effect as -append
. Without -tile 1x
, it would join the images like +append
, defaulting to -tile x1
(any number of columns on one row).
(See ImageMagick Examples: Montage, Arrays of Images.)
Solution 2:
Use -resize
if the images don't have the same width/height
You can fix the height for all of them with the -resize
option, e.g. to fix a 500 pixel height on two images joined horizontally:
convert +append image_1.png image_2.png -resize x500 new_image_conbined.png
Or for vertical joins, you would want to set a fixed width instead:
convert -append image_1.png image_2.png -resize 500x new_image_conbined.png
Example:
image_1.png 1067x600
image_2.png 1920x1080
new_image_conbined.png 889x500
How to do it interactively with GIMP
If you need to crop/resize images interactively first, which is often the case, then GIMP is the perfect tool for it, here's a detailed step-by-step: https://graphicdesign.stackexchange.com/questions/83446/gimp-how-to-combine-two-images-side-by-side/145543#145543
- https://stackoverflow.com/questions/20737061/merge-images-side-by-sidehorizontally
- https://askubuntu.com/questions/226054/how-do-i-join-two-images-together
SVGs
ImageMagick 6.9.11-60 doesn't handle them, so see:
- https://stackoverflow.com/questions/9612434/how-to-concatenate-svg-files-lengthwise-from-linux-command-line
- https://graphicdesign.stackexchange.com/questions/137096/is-there-a-way-to-stack-two-svgs-on-top-of-each-other
- https://graphicdesign.stackexchange.com/questions/90844/joining-together-multiple-svg-images