LC Text Overlay
LC Text Overlay — burn real text onto an image without leaving ComfyUI
- image
- image
LC Text Overlay draws actual text onto an image, in the graph, before you save - so your captions, credits, and "RAW photo" watermarks are baked into the pixels instead of pasted on later in Photoshop. It's the ComfyUI-native answer to "I want words on this image," and it's more capable than a first glance suggests: multiline, wrap-aware, draggable on the preview, and it updates live as you fiddle.
The context that makes this useful: you're already in a pipeline where the text is often data. A filename, a prompt segment, a batch label - wire it in, and every image in the batch gets its own caption baked at save time. That's the thing you can't do by hand-editing after the fact. It also pairs with the pack's save/text nodes so your overlay text and your output filename can come from the same source.
How it works
Under the hood it's PIL's ImageDraw with a curated font list - no models, no downloads, deterministic pixel math. You feed an image and a multiline text box; the text wraps at the image edges with a small margin (so you don't get text spilling off-screen), and the whole block is drawn in one go. The controls that matter:
- text - what to draw. Multiline is supported, and the node even accepts a list of strings (from a Join/Strings node) and joins them with newlines. Handy.
- font - 24 curated families (Arial, Times, Georgia, Verdana, Tahoma, Trebuchet, Comic Sans, and more), each with real font-file paths plus a CSS fallback name for the live preview. Font changes apply on queue; the preview approximates with the CSS name.
- font_size (1–512, default 64) - text height in pixels.
- color_r/g/b (0–255, default white) - the draw color.
- x_percent / y_percent (0–100) - position. Drag on the preview to place it; the widgets follow, and vice versa.
y_percentis the top of the text block, default 92 = near the bottom. - alignment - left / center / right. The legacy
*-top/center/bottomanchor values from older workflows still load and map onto the three real alignments.
One image in, one image out. It's an output node, so it can sit at the end of the chain feeding your Save Image directly.
Where people get burned
The live preview is good but it's a simulation - the actual render resolves fonts on queue. If what you see doesn't quite match what you get, it's almost always a font-family mismatch: the pack ships without bundled font files, so it falls back to whatever arial.ttf-style file exists on your system (or DejaVu/Liberation on Linux). The curated list is chosen so the fallback is close, but it won't be identical on every OS.
Text at tiny font sizes on a big image is a common first-run disappointment - 64px is large on a 1024 image, small on a 4K one. Size is in pixels, not percent, so it doesn't scale with your canvas. Set it per-output-size and don't expect one value to survive a resize.
Install
Part of lonecatone23's ComfyUI_LC123_nodes pack:
- ComfyUI Manager - search "LC123" or "ComfyUI_LC123_nodes", install, restart.
- Manual -
cd ComfyUI/custom_nodes && git clone https://github.com/lonecatone23/ComfyUI_LC123_nodes, restart.
No pip packages, no models. Pure PIL over ComfyUI's environment. (Also worth knowing: the pack includes LC Watermark for image watermarks and LC Apply LUT for color-grade .cube files - the "put stuff on top of the frame" family lives together here.)
The honest verdict
For in-graph text this is a genuine convenience - drag-to-place, live position, batch-capable. If you only ever caption one image at a time, any image editor does it faster. The moment you're rendering a batch with per-image labels, this is the only sane way to do it. Just remember the pixel-based font size and the fallback-font caveat and you're fine.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| text | STRING | Hello | Text to draw (wraps at edges with a small margin) |
| font | COMBO | Arial | Font family (curated list — changes apply on queue; live preview uses matching CSS name) |
| font_size | INT | 641–512 | Font size in pixels |
| color_r | INT | 2550–255 | Red |
| color_g | INT | 2550–255 | Green |
| color_b | INT | 2550–255 | Blue |
| x_percent | FLOAT | 50.00–100 | X position (% from left). Drag on preview or use the widget. |
| y_percent | FLOAT | 92.00–100 | Y of the top of the text block (% from top). Default near bottom. Drag or use the widget. |
| alignment | COMBO | center | Horizontal alignment: left / center / right. Legacy *-top/center/bottom values still load and map to left/center/right. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |