Image Grid Composite 3x3
Nine images in, one contact sheet out
- image1
- image2
- image3
- image4
- image5
- image6
- image7
- image8
- image9
- IMAGE
Comparing nine images side by side - nine seeds, nine LoRA strengths, nine steps of a parameter sweep - is a lot easier as one grid you can glance at than nine separate previews you're scrolling between. ImageGridComposite3x3 does exactly one thing: it takes nine images and tiles them into a single 3×3 grid, no options, no configuration, just plug in nine sockets and get one composite back.
It's the simplest node covered in this series, and that's the point - sometimes you don't want a flexible grid builder with rows and columns and spacing controls, you just want the fast version for the most common case.
How it works
The nine inputs get arranged left-to-right, top-to-bottom - image1 top-left, image3 top-right, image7 bottom-left, image9 bottom-right - and concatenated directly into one larger canvas. There's no scaling, spacing, or border logic exposed; each input tile occupies its slot at whatever size it comes in at, so mismatched input sizes will produce a mismatched-looking grid.
The inputs and outputs that matter
All nine inputs - image1 through image9 - are required and functionally identical; there's no meaningful subset to highlight, they're all just "one tile of the grid." The only real decision you make with this node is which of your nine images goes in which socket, since that determines its position in the final grid.
Output is a single IMAGE - the composed 3×3 grid, ready for Preview Image or Save Image.
How to install it
Via ComfyUI Manager: search "KJNodes for ComfyUI," install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/kijai/ComfyUI-KJNodes
pip install -r ComfyUI-KJNodes/requirements.txt
then restart. No extra dependencies - plain image concatenation.
Common issues & troubleshooting
The grid looks uneven, with some tiles bigger than others. This node doesn't resize inputs to match each other - if your nine images came from different resolutions or aspect ratios (a common mistake when mixing outputs from different sampler runs), resize them to a common size with a standard resize node before feeding them in here.
You need fewer or more than nine images. This node is fixed at exactly nine, by design - for a variable count you'd want a different compositing approach, or you can pad out unused slots with a blank image if you only have, say, six results and still want a filled grid rather than restructuring your workflow.
No labels or spacing between tiles. That's intentional for this node - it's a bare concatenation, not a full contact-sheet generator with borders and captions. If you need labels per tile, composite them onto each image individually before this node, since it won't add any itself.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| image1 | IMAGE | — | |
| image2 | IMAGE | — | |
| image3 | IMAGE | — | |
| image4 | IMAGE | — | |
| image5 | IMAGE | — | |
| image6 | IMAGE | — | |
| image7 | IMAGE | — | |
| image8 | IMAGE | — | |
| image9 | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |