Painter Text Overlay
Label every frame in one pass — Painter Text Overlay
- image
- font_color
- image
PainterTextOverlay stamps text onto an image batch - and in video workflows, an image batch is a clip, so this is the "burn a label onto every frame" node. The default text is video-1, which tells you exactly what it's for: keeping your segments straight. When you're chaining a 15-second Wan video out of three five-second clips, or A/B testing two generations side by side, a segment-1 / segment-2 label in the corner is how you tell them apart after the fact. It's also a perfectly fine watermark or annotation tool for anything that needs text baked into pixels.
How it works
It's plain PIL under the hood, and it's honest about it. For each frame in the batch it converts the tensor to a PIL image, draws a one-pixel shadow offset at (x+1, y+1) so the text reads against bright footage, then draws the fill in your font_color at (x_margin, y_margin), and converts back to a tensor. Nothing fancy - no rotation, no alpha gradient, no text box. If you need styled captions, WAS Node Suite's text tools or an image editor do that. If you need "put a label on this clip and move on," this is it.
Colors are flexible: the font_color field takes hex like the default #abdb29, named colors (white, red, …), or a raw r,g,b string. Fonts come from a hardcoded list of common system paths - msyh on Windows, wqy-zenhei / DejaVu on Linux, PingFang on macOS - with PIL's tiny built-in bitmap font as a last resort.
The fields that matter
image- the IMAGE batch in. Every frame gets the same text in the same place.text- what to stamp. Defaults tovideo-1.x_margin/y_margin- pixel offsets from the top-left corner (defaults 50 / 20).font_size(8–256, default 50) andfont_color- the obvious ones.
Output is a single image of the same shape as the input, so it drops straight back into the pipeline - wire it before a combine or save node.
Gotchas
The one that bites: if none of the hardcoded font paths exist on your system, you silently fall back to PIL's default font, which is tiny and bitmap-ugly - a 50px font_size becomes a wall of unreadable microtext. Fix is to actually have one of those fonts installed (most systems do; headless containers often don't). The shadow is also hardcoded to a 1px black offset, so white text on a white background still gets a thin dark edge - usually fine, just know it's not configurable.
Install
Same pack as the rest of PainterNodes:
cd ComfyUI/custom_nodes
git clone https://github.com/princepainter/ComfyUI-PainterNodes
cd ComfyUI-PainterNodes
pip install -r requirements.txt
Or search "PainterNodes" in ComfyUI Manager and restart. No models, no heavy dependencies - it's just PIL doing what PIL does. For a pack that's mostly about video generation, this little labeling node is the quiet workhorse you'll end up using in every comparison workflow.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| text | STRING | video-1 | — |
| x_margin | INT | 500–8192 | — |
| y_margin | INT | 200–8192 | — |
| font_size | INT | 508–256 | — |
| font_color | COLOR | #abdb29 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |