Custom Text Overlay πͺ½
Put words on images without leaving the graph
- image
- image
The cousin of Parameter Overlay, minus the cleverness. Where that node auto-formats generation settings, Custom Text Overlay πͺ½ just puts your text on the image - any text, styled however you like. Watermarks, titles, labels on a comparison grid, batch captioning where each image gets its own line from a loop. Simple, and genuinely the one you'll reach for when the words are yours, not the machine's.
The inputs that do the work
image- the image (or batch of images) to draw on.text- your text, multiline; each line becomes a row. Use\nfor newlines.position-bottom_extend(grows the canvas and puts text below - the default, and the one that never covers pixels),bottom_inside, ortop_inside(overlays on top of the picture).font_size- 8β100, default 25.bg_opacity- 0β1 for the bar behind the text, default 0.7.text_color/bg_color- hex strings, default#FFFFFFon#000000. This is where a Color Picker node plugs in.
Everything is per-batch: give it a batch of images and it renders the same text onto each. Pair it with Loop Start and a list of strings and you've got per-image captions, one per iteration.
How it works
Purely local, zero models: the pack's TextRenderer uses PIL to pick a system font, measure the text, draw a semi-transparent rounded bar, and composite the lines. The mechanism is deliberately boring - that's a feature. There's no AI involved, no font files to download, nothing that breaks when you upgrade a checkpoint. The one implementation detail worth knowing is the bottom_extend mode: it literally makes the canvas taller and places the text in the new strip, so the original pixels are untouched.
Installing it
It's part of ComfyAngel, so one install gets you this and everything else:
cd ComfyUI/custom_nodes
git clone https://github.com/ThepExcel/ComfyAngel.git
Restart ComfyUI, or search "ComfyAngel" in ComfyUI Manager. Pillow is the entire dependency footprint; no model files.
The gotchas
Empty text returns the image unchanged (no error, which is the graceful behavior you want). A blank line in the middle of the text just gets skipped. And hex colors that don't parse fall back to white-on-black rather than crashing - which means a typo like #FFF instead of #FFFFFF quietly gives you the default look, so double-check your hex before you blame the node. That's the whole list; it's a small, honest utility and it stays out of your way.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | β | |
| text | STRING | β | |
| positionopt | COMBO | 3 options: bottom_extend, bottom_inside, top_inside | |
| font_sizeopt | INT | 258β100 | β |
| bg_opacityopt | FLOAT | 0.70β1 | β |
| text_coloropt | STRING | #FFFFFF | β |
| bg_coloropt | STRING | #000000 | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | β |