LoRA Plot Image Saver
LoRA Plot Image Saver labels your grid — the 'saver' part is a lie
- images
- images
First thing to know: the name is a lie. LoRA Plot Image Saver does not save anything to disk. It's an annotator - it stamps a caption onto each image and hands the images back, and you still need a normal Save Image node after it. Mildly annoying naming, but the job it does is the one that makes a LoRA sweep actually readable.
When its sibling LoRA Plot Node hands you nine nearly identical frames, you can't tell which strength is which thirty seconds later. This node fixes that: feed it the same list of images and the metadata strings from LoRA Plot Node, and it paints a label - the LoRA name on one line, "Strength: 0.8" underneath - into the top-right corner of every frame, with a semi-transparent background box so the text survives busy images. It's the label maker that turns a wall of similar outputs into a plot you can actually compare.
Mechanically it's a round trip through PIL: tensors to numpy, to a PIL image, text drawn on top, back to tensors. The font is cached by size and picked from a cross-platform list - DejaVu Sans Bold on Linux, Arial on Windows, Helvetica on macOS, with Pillow's default as the fallback - so it works out of the box on any OS. The metadata string is parsed by splitting on the last underscore, so my_style_0.8 cleanly becomes "my_style" and "0.8". Since it's just a caption renderer, the whole output is an image list - nothing about it is tied to the plot node's internals beyond the expected string format.
The inputs you'll actually touch:
- images - the list of decoded images from your VAE Decode (or anywhere).
- metadata - the strings to caption with. Must match the image count, or be a single string that gets applied to all.
- text_color / background_color - dropdowns with 12 named colors (white, black, red, green, blue, yellow, cyan, magenta, orange, gray, lightgray, darkgray). Defaults: white on black.
- font_size - 8–128, default 24. This is the one you'll fiddle with; the box grows to fit.
- padding - 0–50 px around the text, default 10.
- opacity - 0.0–1.0 for the background box, default 0.8.
Output: images, as a list.
Gotchas worth knowing before you wire it up:
- It returns images; it doesn't save them. Put a Save Image (or Save Animated WEBP) node after it. The "Saver" name gets people every time.
- List length mismatch throws. If the metadata list doesn't match the image list (and isn't a single string), it raises a clear error rather than silently mislabeling. That's actually a feature.
- It's not limited to LoRA Plot. Since it's just an image-plus-text renderer, you can use it to caption side-by-side comparisons, prompt variations, or any grid output - anything with a list of images and a matching list of strings.
- Mismatched captions happen if you feed metadata that isn't in
name_strengthformat; it'll just use the whole string as the label, which is usually fine.
Installing is the same story as the rest of the pack: ComfyUI Manager, search "LoRA Plot", or
cd ComfyUI/custom_nodes
git clone https://github.com/Hearmeman24/ComfyUI-LoRAPlotNode.git
then restart. No model downloads, no extra dependencies beyond the Pillow/NumPy/torch that ship with ComfyUI. Small pack, MIT licensed, does one boring job well - and for keeping a strength plot legible, that's exactly what you want.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| metadata | STRING | — | |
| text_color | COMBO | white | 12 options: white, black, red, green, blue, yellow, +6 |
| background_color | COMBO | black | 12 options: white, black, red, green, blue, yellow, +6 |
| font_size | INT | 248–128 | — |
| padding | INT | 100–50 | — |
| opacity | FLOAT | 0.80–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |