Compare Nine Images
The A/B compare node that kills tab-switching
- reference_image
- compare_image_1
- compare_image_2
- compare_image_3
- compare_image_4
- compare_image_5
- compare_image_6
- compare_image_7
- compare_image_8
- compare_image_9
You've been here: you set a fixed seed and sweep CFG from 4 to 12, or compare a checkpoint against four LoRA strengths, and now you have a wall of preview images to squint at. Download them all, open them side by side, alt-tab until your eyes bleed. NineImageCompare exists to kill that workflow. It's the kind of node that doesn't generate anything - it just makes looking at your outputs dramatically less miserable.
It's exactly what the name says: one reference image up against up to nine comparison images, laid out in a grid where each cell has a draggable split slider, like the before/after widgets on every skincare ad ever. Drag, and the left/top side of every cell reveals the reference image while the right/bottom shows the comparison, all synced to the same position. It's a UI tool, not a model - there are no weights, no checkpoints, no VRAM cost, and the author marks it experimental in the schema.
How it works
Under the hood it's two pieces doing a hand-off. The Python side is barely a wrapper: on execute it runs ComfyUI's built-in PreviewImage node to save the reference and each connected comparison image (with comfy.compare.* filename prefixes), then hands the saved image paths back to the frontend. The actual compare UI lives in js/compare.js, a custom DOM widget that builds the grid after each run.
A few details are worth knowing because they shape how it behaves:
- Grid size is automatic. It counts how many compare inputs actually have images wired in (1 to 9) and computes
cols = ceil(sqrt(count))- so 1–4 images get a 2-wide grid, 5–9 get a 3-wide one. - One reference, shared everywhere. Every cell pairs your single
reference_imageagainst a different compare image. It's "baseline vs. many," not pairwise among the nine. - Drag direction auto-locks. You can drag either way; once your mouse moves past 3px it locks to horizontal (left/right reveal) or vertical (top/bottom reveal) and applies that to all cells at once. That sync is the whole trick - you're comparing the same region across every variant simultaneously.
- No outputs. It's a terminal node;
info_schemalists zero outputs and it's markedis_output_node, so it sits at the end of the graph like a PreviewImage.
The inputs
All ten inputs are IMAGE-typed and all optional - there are no required inputs, no parameters to tune:
reference_image- the baseline every comparison cell shows. The frontend returns early if this isn't connected, so it's the one input that's effectively mandatory.compare_image_1throughcompare_image_9- the variants. Hook up as many as you have; the node tolerates gaps. Typical wiring is a bunch ofLoadImagenodes (the bundled example workflow does exactly that), or the outputs of whatever branches you're comparing.
If you're sweeping seeds or samplers, a cleaner trick is to wire sampler outputs through SaveImage/PreviewImage in each branch and then pull the images back in - but for most people, loading finished renders into the nine inputs is the whole point.
Installing it
No dependencies beyond ComfyUI itself - there's no requirements.txt, no models to download. From the README:
cd ComfyUI/custom_nodes
git clone https://github.com/smthemex/Nine_Image_Compare.git
Then restart ComfyUI. ComfyUI Manager can also grab it if you search for "Nine_Image_Compare."
One real gotcha: this pack is written against the new ComfyUI extension API - it imports comfy_api.latest and registers through ComfyExtension/comfy_entrypoint() rather than the legacy NODE_CLASS_MAPPINGS. That means it needs a recent ComfyUI build. If you're on an older install and the node won't load, update ComfyUI before you blame the pack. It's also worth knowing this is a rework of ComfyUI's own image-compare node (the source comment says so), stretched from two images to nine.
Troubleshooting
The honest answer is that this is a tiny, low-traffic, experimental node, so there's no big community war-story archive to lean on - the failure modes are mostly the usual suspects:
- Node missing from the menu - almost always the outdated-ComfyUI issue above, since
comfy_apionly exists in newer builds. - Nothing renders - you need
reference_imageconnected; the JS bails if there's no reference data. - Slider feels stuck - drag more than 3px; it waits for a direction to lock onto before moving anything.
- Images piling up - it saves previews through
PreviewImageevery run, so files accumulate in ComfyUI's output/temp like any preview. Don't be surprised to seecomfy.compare.*files in there.
If you A/B test anything regularly, this is worth the two minutes to install. It's not glamorous, but it's the difference between squinting at a folder of PNGs and actually seeing the difference your settings make.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| reference_imageopt | IMAGE | — | |
| compare_image_1opt | IMAGE | — | |
| compare_image_2opt | IMAGE | — | |
| compare_image_3opt | IMAGE | — | |
| compare_image_4opt | IMAGE | — | |
| compare_image_5opt | IMAGE | — | |
| compare_image_6opt | IMAGE | — | |
| compare_image_7opt | IMAGE | — | |
| compare_image_8opt | IMAGE | — | |
| compare_image_9opt | IMAGE | — |
Outputs (0)
No outputs