Nodes/radiance/Contact Sheet
ComfyUI Node

Contact Sheet

Review 48 frames in one glance instead of 48 clicks

By FXTD-Studios·Created 8 months ago·Updated about 18 hours ago· 246
Contact Sheet
  • images
  • contact_sheet
  • grid_cols
  • grid_rows
◄thumb_width160►
◄max_cols8►
◄label_framestrue►
◄backgroundBlack►

You rendered a 48-frame batch. Now you're going to click through the preview one frame at a time, find the ones that matter, and lose your place twice. Contact Sheet exists so you don't.

What it does

Takes an IMAGE batch, lays every frame out in a grid left-to-right then top-to-bottom, and returns the grid as a single image. Thumbnails can carry their frame index underneath if you want them to, and max_cols caps the columns while the node works out how many rows that needs.

Three outputs:

  • contact_sheet (IMAGE) - the grid itself.
  • grid_cols (INT) and grid_rows (INT) - the layout it chose. Feed these into a split-view, a crop, or a "which cell is frame 37" bit of arithmetic instead of recomputing it by hand.

The inputs you'll actually set

thumb_width defaults to 160px and is the only real quality knob - at 512 wide you can judge a face; at 160 you can judge composition, which is usually all you need. max_cols at 8 gives you a nice wide strip for a batch of 16 or 24.

Then two optionals worth knowing about. label_frames burns the frame number beneath each thumbnail - leave it on, because a grid without indices turns a "fix frame 19" conversation into an argument. background handles empty cells and label strips and offers Black, Grey or White; Grey is 64/255, which is a slightly odd value to have picked, but it's a decent neutral when your frames are mostly dark.

The one gotcha

The tooltip is blunt about it: input is clamped to [0, 1] and resized through 8-bit, so display-encoded input is expected. Feed it scene-linear HDR and you get a grid of blown-out white thumbnails with weird dark midtones - technically your image, uselessly rendered.

So: if your chain is working in linear float, decode to display first. Radiance's OCIO ColorSpace or GPU Tensor Ops nodes will get you there; put the contact sheet at the end of that, not before it.

The second thing to internalise is that this is a review artifact, not a deliverable. It's for your eyes and a client's, and it's 8-bit by construction. Don't route a grade through it.

Where it fits

Contact Sheet is the second half of a workflow that Radiance actually cares about: dailies. Burn-In stamps frames with timecode and shot metadata, Contact Sheet turns the same batch into one image you can scroll through, and Flipbook GIF makes the motion version. Between the three you've got a review loop that doesn't involve opening a file browser.

It's also genuinely useful during development rather than delivery. Sweep a parameter, render 12 frames, look at one sheet, decide. That's a much better feedback loop than eyeballing a canvas.

Install

Ships in Radiance. ComfyUI Manager → search Radiance → install → restart → refresh the browser. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/fxtd-studios/radiance.git
cd radiance
python -m pip install -r requirements.txt

Windows portable users: run that pip line with python_embeded\python.exe. No model downloads for this node.

CategoryFXTD STUDIOS/Radiance/Review

Inputs (5)

NameTypeDefaultDescription
imagesIMAGEFrame batch to lay out, left to right then top to bottom. Clamped to [0, 1] and resized through 8-bit, so display-encoded input is expected.
thumb_widthINT16032–512Width of each thumbnail in pixels.
max_colsINT81–32Maximum number of columns. Rows are computed automatically.
label_framesoptBOOLEANtruePrint the frame index below each thumbnail.
backgroundoptCOMBOBlackFill colour for empty cells and label strips (Grey is 64/255).

Outputs (3)

NameTypeDescription
contact_sheetIMAGE—
grid_colsINT—
grid_rowsINT—