GridAnnotation
Label Your Grid Cells So You Actually Know What You Compared
- GRID_ANNOTATION
A grid of eight images where you can't remember which column was the different checkpoint and which row was the different seed is just noise with extra steps. GridAnnotation exists to fix exactly that: it's the label-maker for the ImagesGrid pack. It doesn't touch pixels in your image - it builds a little bundle of text and font settings that the two grid nodes (ImagesGridByColumns and ImagesGridByRows) read to draw labels along the top row and left column of your comparison grid.
How it works
The node takes three text inputs and produces one GRID_ANNOTATION object. That object isn't an image and it isn't a standard type - it only plugs into the optional annotation input on the two grid nodes, and that's the only place it can go. Internally it bundles up a list of column labels, a list of row labels, and a font at your chosen size, and hands them off. The grid node does the actual drawing: row labels get a padding column on the left, column labels get a padding row on top, and each label is centered in its cell.
The separator you need to know is the semicolon. Labels are semicolon-split: seed 42; seed 43; seed 44 in column_texts gives you three column labels. Don't put a literal ; in a label - it will split. One nice touch: row labels support multi-line text with \n, so a row label like SDXL\ncfg 7 renders on two lines. The font is a Roboto that ships inside the pack's static/ folder - no font downloads, nothing to configure. font_size (default 50) is the one knob, and it's pixels, so on big grids you'll often want to nudge it down so labels don't dwarf the tiles.
The inputs that matter
column_texts(STRING, multiline) - one label per column, semicolon-separated.row_texts(STRING, multiline) - one label per row, semicolon-separated.font_size(INT, default 50) - label size in pixels.
Output is the GRID_ANNOTATION object, wired into a grid node's annotation input.
Installing the pack
This is one of five nodes in ImagesGrid (LEv145/images-grid-comfy-plugin), so install the pack and the whole set lands at once. ComfyUI Manager: search "ImagesGrid". Or:
cd ComfyUI/custom_nodes
git clone https://github.com/LEv145/images-grid-comfy-plugin ImagesGrid
then restart. Zero extra dependencies, zero models, zero keys - the only file it needs beyond ComfyUI's own Pillow is the bundled Roboto font.
Where people get burned
The first failure mode is self-inflicted: at least one of the two text fields has to be non-empty, or the grid node throws "Column text and row text is empty." If you only want row labels, leave column_texts empty - that's fine - but empty on both sides is an error.
Second, the label count is whatever you gave it, and the grid doesn't complain when they don't match. If your grid has 6 columns and you typed 3 column labels, the first 3 get labeled and the rest stay blank - no warning. This is where the pack's fiddly reputation shows up: hand-counting semicolons is exactly the kind of thing that makes a "quick comparison" workflow take longer than manual editing, which is the most common community complaint about the pack. And remember the labels live in a padding strip added around your tiles, which makes the final image wider and taller - another reason to keep font_size sensible.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| column_texts | STRING | — | |
| row_texts | STRING | — | |
| font_size | INT | 50 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| GRID_ANNOTATION | GRID_ANNOTATION | — |