Nodes/ComfyUI-JH-PixelPro/Color: Lightroom Preset Contact Sheet
ComfyUI Node

Color: Lightroom Preset Contact Sheet

Twenty Presets, One Photo, One Grid — Pick With Your Eyes

By jetthuangai·Created 6 months ago·Updated a day ago· 6
Color: Lightroom Preset Contact Sheet
  • image
  • sheet
  • presets
◄collectionAll►
◄columns4►
◄thumb_size320►
◄max_presets24►
◄search►
◄tone_enginelocal►

Preset names lie. "Warm Film" looks different on skin than on a landscape, "Moody Green" is moody on one frame and muddy on the next, and the only way to choose is to see them on your photo. Doing that one at a time in a node graph is a click-fest.

Color: Lightroom Preset Contact Sheet (JHPixelProLightroomPresetSheet) renders a whole collection as one labelled grid on the image you're actually working on. It's the Lightroom "hover over the preset panel" experience, except you get a single image you can preview, save, or send to a client.

What it renders

The first frame is downscaled once with area averaging so its long edge is at most thumb_size. Then each preset in the chosen collection is read and translated to ColorLab settings - parsed presets are cached by file and modification time, so repeat runs are fast - and applied with exposure in linear light, exactly as the Lightroom Preset node does at strength 1.0. The local tone engine runs on the GPU when there is one.

Tiles get assembled with Pillow: 6 px gaps, a label strip above each tile, names cut at 48 characters. So a tile here looks like the full-size node's output at strength 1.0 - which is the honest thing for a comparison sheet and also the thing to remember when your chosen preset ends up too strong at full size.

Inputs and outputs

image - the photo to preview on. First frame only; a batch won't get you multiple sheets.

collection - All, ★ Favorites, Recent, or any sub-folder of your preset directory (Lightroom's preset groups become collections).

columns (1–12, default 4), thumb_size (128–768, default 320), max_presets (1–200, default 24).

Optional: search (only names containing these words) and tone_engine (local / legacy).

Outputs: sheet - the labelled grid, original first, then each preset. And presets - the names in sheet order, one per line, which is what you actually work from afterwards.

How to use it without wasting an afternoon

Star your shortlist in the Lightroom Preset node's browser first, then set collection to ★ Favorites and run the sheet on each new shoot. That turns preset selection into one node instead of a dozen.

Pick a test photo with skin, neutrals and some saturated colour. Presets that are indistinguishable on a landscape diverge wildly on skin, and skin is usually what you're grading.

A [!] tile means part of the original look is missing - usually a creative profile that can't be in the file. Check that preset's report in the Lightroom Preset node before you build a shoot around it.

And trust the presets output over the picture. Presets that can't be read are left out of the sheet, so the list is the reliable record of what you're looking at when you're counting tiles at low resolution.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/jetthuangai/ComfyUI-JH-PixelPro.git
cd ComfyUI-JH-PixelPro
pip install -r requirements.txt   # the Python that runs ComfyUI
mkdir -p ComfyUI/models/lightroom_presets   # your .xmp / .lrtemplate collection

ComfyUI Manager: search ComfyUI-JH-PixelPro → Install → restart → Add Node → ComfyUI-JH-PixelPro → color. Deps: kornia>=0.7, mediapipe>=0.10.33, opencv-python-headless>=4.8, scipy>=1.10; PyTorch from ComfyUI. Pillow is already there via ComfyUI. Two sample presets ship in the pack, so the sheet renders something the first time you plug it in. Speed is genuinely fine: 10 presets at 320 px is about 0.14 s on GPU after warm-up.

Where people get burned

  • Every tile looks like the same photo at the same strength. That's what it is - all at 1.0, by design. Your job after choosing is to dial strength down in the single-preset node.
  • Your new presets don't appear. They're outside ComfyUI/models/lightroom_presets/, or in a sub-folder whose collection you haven't selected.
  • Blank or missing tiles. Presets that fail to parse are dropped from the sheet. Empty presets entries would be worse, hence the drop.
  • A 200-preset folder at 768 px. It's an image, and it'll be a very large one. max_presets exists for a reason.

One thing this node is quietly good at: it's a deterministic, model-free way to evaluate a look. No diffusion pass, no seed, no "roll again and see" - the same sheet every run. Whatever colour grading you're experimenting with, having a stable reference grid beats judging single images from different generations, which is how people end up chasing their own tail with prompts.

The pack is Apache-2.0, maintained by JH (@jetthuangai), currently v1.10.0 with 64 nodes, docs in English and Vietnamese and a before/after for every node. There's no Reddit discussion of it to lean on - searching the pack name in the corpus returns exactly one unrelated browser extension - so the bundled docs and your own two eyes remain the whole literature.

CategoryComfyUI-JH-PixelPro/color

Inputs (7)

NameTypeDefaultDescription
imageIMAGEPhoto to preview the presets on (first frame).
collectionCOMBOAllAll, Favorites, Recent or a preset sub-folder.
columnsINT41–12—
thumb_sizeINT320128–768Tile long edge.
max_presetsINT241–200—
searchoptSTRINGOnly names containing these words.
tone_engineoptCOMBOlocal2 options: local, legacy

Outputs (2)

NameTypeDescription
sheetIMAGELabelled grid: the original, then each preset.
presetsSTRINGNames of the presets on the sheet, one per line (same order).