Contact Sheet Maker πΊοΈ
The OmniNodes contact sheet for batch QA
- images
- contact_sheet
You just queued a wildcard sweep that produced forty images, or a LoRA training set, or a batch of frames you need to eyeball for a broken one. Opening them one by one is miserable. Contact Sheet Maker is the pack's answer: it takes a whole IMAGE batch and tiles it into a single grid so you can scan everything at once.
It's a dead-simple node, and honestly that's the point. Feed it images, pick how many columns you want, and it lays every frame into a grid - rows are implied by batch size divided by columns. Each image is scaled to fit a thumb_size square (256px default), centered on a solid bg_color background (default #141414, a nice dark neutral), with padding pixels between cells. The output is one contact_sheet IMAGE that you wire straight into a Preview or Save node.
Under the hood it's Pillow doing the work - thumbnail() to shrink each frame, then pasting onto a fresh canvas. Nothing model-related, nothing GPU-heavy, milliseconds on a big batch. The batch shape (B, H, W, C) gets walked frame by frame, so it handles non-square sources without squashing them: a tall portrait just sits centered in its square cell with background showing around it.
The few knobs a beginner actually touches:
columns- 4 is a good default; use more for thumbnails, fewer if you want each cell bigger.thumb_size- how big each cell is. Crank it if you need to read detail, drop it for a glanceable overview.bg_color- the only cosmetic choice; any hex string works.
The one honest caveat: this grid is unlabeled. It tells you nothing about which image came from which seed or sampler setting. For a sweep where knowing which setting made that image is the whole game, that's a real limitation - and it's deliberate. The same pack ships Image Grid Compare for exactly that job, with a text label under every cell. The pack's own README is explicit about the split: Contact Sheet for browsing a batch, Grid Compare for comparing. Use them as intended and you won't be confused about why one has labels and the other doesn't.
It's genuinely handy for its narrow job - visual QA of big batches, checking a dataset for bad crops, or just confirming a sweep ran. Pair it with the pack's Wildcard Loader and Batch Counter upstream and you've got a whole "roll the dice, look at everything, pick a winner" loop that needs no extra nodes from anywhere else.
Install
This is an OmniNodes node, so you install the whole pack once:
cd ComfyUI/custom_nodes
git clone https://github.com/TensorVizion/OmniNodes
Then restart ComfyUI. Or search "OmniNodes" in ComfyUI Manager and install from there. This node needs no extra pip packages - the Image category runs on Pillow/NumPy/PyTorch, all already in ComfyUI.
Troubleshooting
- Grid looks wrong / images overlap - check
columnsagainst your batch size; the node just divides, so a batch of 9 with 4 columns gives you 2 rows plus a partial one. That's fine, it's how contact sheets work. - Node doesn't show up - restart ComfyUI and look for
[OmniNodes]lines in the terminal.β Loadedmeans it registered;β Error importingmeans a real failure with a traceback you can read.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | β | |
| columns | INT | 41β32 | β |
| thumb_size | INT | 25632β2048 | β |
| padding | INT | 80β128 | β |
| bg_color | STRING | #141414 | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| contact_sheet | IMAGE | β |