Contact Sheet Image Loader
Stop hunting through ComfyUI's file picker — pick your best gen from a numbered contact sheet
- load_trigger
- contact_sheet
- image
- mask
- filename
The standard ComfyUI Load Image node is a wall of filenames. You generate thirty variants, two are keepers, and then you squint at timestamps in a file dialog trying to remember which one was the good one. Contact Sheet Image Loader exists to kill that workflow: it scans a folder, renders the most recent images as a numbered thumbnail grid right on your canvas, and lets you pick by number. The name is literal - it's a contact sheet, like the prints film photographers used to pin up.
What it actually does
This is a single-node pack (category image/loaders), so there's nothing else to learn. It globs a folder for JPG, JPEG, PNG, BMP, TIFF, TIF, and WEBP, sorts by modification time newest-first, and builds an 8-column grid of thumbnails. Each thumbnail is LANCZOS-downscaled into a padded square with its number badge in the bottom-right corner, and the whole grid is returned as one IMAGE tensor - feed that straight into ComfyUI's Preview Image node and you've got your visual index.
The useful part is the second output: image, the full-resolution selected file, already normalized to a float tensor. So this isn't just a preview widget - it's a genuine loader that slots into the middle of a workflow. It also hands you a mask (a fully-white MASK the same size as the image, i.e. "everything visible") and filename as a STRING if you want the name for a save path or a text display.
The inputs that matter
Only a few things to touch:
folder_path- defaults to ComfyUI's output directory automatically. Point it anywhere else if your gens land elsewhere.selected_image- the one number you actually set: 1–64, matching the badges on the sheet.rows- grid height. 1 row = 8 images, up to 8 rows = 64. More rows means a bigger preview and a longer list to hunt through.thumbnail_size- 64–512 px per thumb, default 256. Bump it if you want to actually judge detail before picking.load_trigger- a wildcard*input. It's marked optional in the schema, but you want it connected: it's the refresh signal.
The catch (and it's by design)
Here's where people get burned. The sheet re-sorts by modification time every time it refreshes, so "newest is #1" is a moving target. Run the workflow again, generate a new image, and your old #3 is now #4. The node watches the folder's modification time and the trigger value, and re-scans when either changes - so if new gens aren't showing up, it's usually that you haven't wired load_trigger to anything, or you've pointed it at the wrong folder (an empty path returns a gray placeholder with filename = "no_image"). One gotcha in the code's history: an early version only refreshed when the trigger changed, which missed files saved between runs - fixed by tracking folder mtime, but it's why you should connect the trigger anyway.
Also know what it isn't: a batch loader. It's one deliberate pick per run. The author said as much in the release thread - multi-select ("1,3,7,10-14") is a v2 idea, not this. For batch processing the whole folder, reach for the batch loader nodes instead; use this when you've eyeballed the grid and want that one image sent into an upscale or inpaint stage.
Install
Easiest via ComfyUI Manager → "Install via Git URL":
https://github.com/benstaniford/comfy-contact-sheet-image-loader.git
Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/benstaniford/comfy-contact-sheet-image-loader
Then restart ComfyUI. No model downloads, no heavy deps - it only needs torch, torchvision, Pillow, and numpy, which every ComfyUI install already has (opencv is listed optional and the code doesn't require it). You'll be looking at thumbnails a minute after install.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| folder_path | STRING | /tmp/ComfyUI/output | Path to folder containing images |
| selected_image | INT | 11–64 | Select image 1-64 from the contact sheet |
| thumbnail_size | INT | 25664–512 | Size of thumbnails in pixels |
| rows | INT | 11–8 | Number of rows (1=8 images, 2=16, ..., 8=64) |
| load_triggeropt | * | Connect any output here to refresh thumbnails (optional) |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| contact_sheet | IMAGE | — |
| image | IMAGE | — |
| mask | MASK | — |
| filename | STRING | — |