Contact Sheet
Review 48 frames in one glance instead of 48 clicks
- images
- contact_sheet
- grid_cols
- grid_rows
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) andgrid_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.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | Frame 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_width | INT | 16032–512 | Width of each thumbnail in pixels. |
| max_cols | INT | 81–32 | Maximum number of columns. Rows are computed automatically. |
| label_framesopt | BOOLEAN | true | Print the frame index below each thumbnail. |
| backgroundopt | COMBO | Black | Fill colour for empty cells and label strips (Grey is 64/255). |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| contact_sheet | IMAGE | — |
| grid_cols | INT | — |
| grid_rows | INT | — |