Nodes/OmniNodes/Contact Sheet Maker πŸ—ΊοΈ
ComfyUI Node

Contact Sheet Maker πŸ—ΊοΈ

The OmniNodes contact sheet for batch QA

By TensorVizionΒ·Created 3 months agoΒ·Updated about 8 hours agoΒ· 0
Contact Sheet Maker πŸ—ΊοΈ
  • images
  • contact_sheet
β—„columns4β–Ί
β—„thumb_size256β–Ί
β—„padding8β–Ί
β—„bg_color#141414β–Ί

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 columns against 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. βœ… Loaded means it registered; ❌ Error importing means a real failure with a traceback you can read.
CategoryTensorVizion/Image

Inputs (5)

NameTypeDefaultDescription
imagesIMAGEβ€”
columnsINT41–32β€”
thumb_sizeINT25632–2048β€”
paddingINT80–128β€”
bg_colorSTRING#141414β€”

Outputs (1)

NameTypeDescription
contact_sheetIMAGEβ€”