ComfyUI Node

Add Text Label

Stamp a caption on any image without ever leaving ComfyUI

By Seb-Lis·Created 10 months ago·Updated 10 months ago· 1
Add Text Label
  • image
  • IMAGE
textYOUR TEXT
font_familyArial
font_size30
placementtop_left
edge_offset30
color_schemeblack_on_white
padding15
corner_radius15

Add Text Label is the whole show in this pack: comfyui-image-labeler ships exactly one node, and it does one thing. You feed it an image and a string, and it draws that string onto the image inside a semi-transparent rounded box. That's it. No API calls, no model downloads, no weights - just Pillow doing text rendering in the middle of your graph.

Why would you want that in a workflow instead of slapping text on afterward? Because "afterward" is where people forget, and this is the kind of node that makes your output self-documenting. Label a comparison grid so you know which column was which seed. Watermark a batch before it goes out. Tag variants in a workflow you're sharing so the person who downloads it can tell prompt A from prompt B. It's a quality-of-life node, not a model - nobody's writing Reddit threads about it, but it quietly stops you from posting the unlabeled grid and going "wait, which one was the LoRA again?"

How it works

Under the hood it's about twenty lines of Pillow, and it's worth knowing because it explains the two things people get surprised by. It converts your IMAGE tensor to PIL, measures the text with your chosen font, draws a rounded rectangle on a separate overlay layer at 50% alpha, composites that onto the image, and then draws the text fully opaque on top - centered in the box, so the image genuinely shows through behind the label. Then it converts back to a tensor and returns it.

The other thing: it loops over the whole batch. Feed it a batch of four images and all four get the same label stamped on them. That's usually what you want for watermarking or labeling a batch, but it means there's no per-image text field - one label per batch, take it or leave it.

The inputs that matter

Only two are required: image and text. Watch the text default - it's literally "YOUR TEXT", and at least one person in every generation forgets to change it before saving. The rest are optional, and honestly only three are worth touching at first:

  • placement - top_left / top_right / bottom_left / bottom_right / center. Defaults to top_left.
  • font_size - 6 to 256, default 30.
  • color_scheme - black_on_white (default) or white_on_black.

The fine-tuners (edge_offset, padding, corner_radius, font_family) are there if you care about aesthetics; defaults are sensible. The output is a single IMAGE, which wires straight into a Preview Image or Save Image node.

Installing it

There's no requirements.txt and no dependency install - it uses only Pillow, numpy, and torch, which ComfyUI already has. That's the rare custom node that can't break your environment (see the ecosystem docs for how often dependency conflicts do wreck installs). The README's claim of "no installation needed, just drag and drop to your custom nodes folder" is essentially true - it's one file.

Realistically, use ComfyUI Manager and search "image labeler":

ComfyUI Manager → Custom Nodes Manager → search "comfyui-image-labeler" → Install → restart

Or clone it manually:

cd ComfyUI/custom_nodes
git clone https://github.com/Seb-Lis/comfyui-image-labeler

…then restart ComfyUI. No model files, no extra Python, done.

Where people get burned

The biggest trap is fonts on Linux. The node looks up Arial or Monospace from your system fonts, and if it can't find one it silently falls back to Pillow's default bitmap font - which is tiny, ugly, and ignores your font_size. If you're on Linux and your label looks wrong no matter what size you set, install the MS core fonts (msttcorefonts) or DejaVu Sans Mono, and restart ComfyUI so the font cache picks them up.

Second: text is single-line (multiline: false). A newline in your string won't render as two lines; keep labels short. And since there's no text_align or color picker beyond the two fixed schemes, you can't get fancy - this is a stamp, not a Photoshop text layer. For a node this small, that's fine.

Categoryimage/annotation

Inputs (9)

NameTypeDefaultDescription
imageIMAGE
textSTRINGYOUR TEXT
font_familyoptCOMBOArial2 options: Arial, Monospace
font_sizeoptINT306–256
placementoptCOMBOtop_left5 options: top_left, top_right, bottom_left, bottom_right, center
edge_offsetoptINT300–4096
color_schemeoptCOMBOblack_on_white2 options: white_on_black, black_on_white
paddingoptINT150–256
corner_radiusoptINT150–128

Outputs (1)

NameTypeDescription
IMAGEIMAGE