Three layouts, three different use cases
| Layout | Good for |
|---|---|
| Row | Before/after comparisons, a horizontal filmstrip, product variants side by side |
| Column | A vertical sequence for a story-format post, step-by-step screenshots stacked |
| Grid | A contact sheet, a set of thumbnails, a square-ish arrangement for a moodboard |
Why nothing gets upscaled
When images of different sizes are combined, something has to give — either the smaller ones get stretched up to match the largest, or everything scales down to match the smallest. This tool always does the latter. A row matches every image to the shortest one's height; a column matches every image to the narrowest one's width; a grid sizes every cell to the smallest image's dimensions. The result is that nothing in the output ever looks blurrier than its own original resolution — the trade-off is that a single very small image in the batch will bring the whole result down to its size.
If that trade-off doesn't work for a particular batch, the fix is usually to resize the smaller images up first with a dedicated resizer, accepting the softness that comes with enlarging, before combining them here.
How the grid decides its shape
The column count is calculated from the square root of how many images you have, rounded up — so 2 or 3 images become a single row, 4 become a 2×2 grid, 5 to 9 become 3 columns, and so on. Images that don't perfectly match their cell's aspect ratio are centred within it rather than stretched, with the background colour filling any remaining space — the same way a contact sheet or a photo grid app would handle mixed orientations.
Spacing and background colour
Spacing adds a gap of the pixel width you choose between every image, filled with the background colour. Set spacing to 0 for images that touch edge to edge with no border at all — useful when you want the combined image to read as one continuous scene rather than a set of separate photos. A visible background colour (white is the default) works well when you want each photo to read clearly as its own frame.
Choosing an output format
PNG is the default because it's lossless — the combined result doesn't lose any quality from the images you started with, at the cost of a larger file. JPEG gives a smaller file if the result doesn't need transparency and some compression is acceptable. WebP is a good middle ground if you control where the image is going.
Nothing is uploaded to do this
Every image is decoded and drawn onto a single canvas entirely inside your browser, using the Canvas API. Open your network tab, or disconnect from the internet after the page loads — the tool keeps working, because none of the images ever leave your device.