Image Grid Compare π
A labeled comparison grid for sweeps β and a highlight ring for the winner
- images
- grid_image
- summary
You ran a sampler sweep, or five LoRA strengths, or eight seeds, and now you have a batch of images where every frame differs by exactly one setting. The question is which one is best - and to answer it you need to know which frame is which. Image Grid Compare is the node built for that: a side-by-side grid with a text label under every cell, so the answer to "which setting made that image" is right there on the canvas.
Give it images and a newline-separated labels string - one label per image, matched by position (label N under image N). Fewer labels than images? The remaining cells get auto-numbered (#4, #5, ...) instead of failing, which is a nice touch when you're too lazy to label all thirty. Grid layout follows the same columns/thumb_size/padding shape as the pack's Contact Sheet Maker - which is deliberate, and the reason this node exists separately: the other one tiles a batch for browsing with no labels, this one labels every cell for comparing. The pack's README is explicit about the distinction, and it's the right call.
The distinctive knob is highlight_index. Set it to a cell (0-indexed) and the node draws a colored border around it - highlight_color, default a punchy green. That's for marking "this is the setting I actually used" in a sweep of alternatives, so when you look at the saved grid later (or send it to a client), the winner is obvious. label_height and label_color/bg_color control the label strip and grid background.
Outputs: grid_image (the assembled grid) and a summary string. The summary repeats the label set back - handy for confirming the mapping when you've wired a lot of labels in.
Where it really shines is composition with the rest of the pack. OmniNodes' Multi-LoRA Weight Sweep outputs a labels list designed to feed straight into this node's labels input - run a strength sweep, and the grid auto-labels every frame with its strength. That's the workflow this node was clearly built for: sweep β labeled grid β pick the winner, all inside the graph, no spreadsheet required.
Honest notes: the labels come in as one multiline string, so you can't wire a per-image list of strings directly - you join them with newlines upstream. And there's no fancy tiling (every cell is a thumb_size square, so tall or wide images get letterboxed within their cell via background color). For the comparison-grid job - where uniform cells are actually the point - that's fine. If you wanted a gallery-style montage, Contact Sheet Maker or a dedicated grid pack is the other option.
Install
Part of OmniNodes:
cd ComfyUI/custom_nodes
git clone https://github.com/TensorVizion/OmniNodes
Restart ComfyUI, or install "OmniNodes" via ComfyUI Manager. No extra dependencies - Pillow, bundled with ComfyUI.
Troubleshooting
- Labels look shifted / wrong mapping - labels match by position. If a run produced fewer images than you labeled (e.g. a failed frame), the mapping silently shifts. Check
summary. - Want labels from a wire, not typed text - join your per-item strings with newlines upstream; the input is one multiline string.
- Grid too big/small - tune
columnsandthumb_size;thumb_sizeup for readable detail,columnsup for density.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | β | |
| labels | STRING | β | |
| columns | INT | 41β32 | β |
| thumb_size | INT | 25632β2048 | β |
| padding | INT | 120β128 | β |
| label_height | INT | 3216β128 | β |
| bg_color | STRING | 20,20,20 | β |
| label_color | STRING | 255,255,255 | β |
| highlight_index | INT | -1-1β4096 | β |
| highlight_color | STRING | 0,255,120 | β |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| grid_image | IMAGE | β |
| summary | STRING | β |