Nodes/ComfyUI_Node_Pack/Text Label (SEB)
ComfyUI Node

Text Label (SEB)

Watermarks, Captions, and Gen Info That Actually Sticks

By Seb-Lis·Created 9 months ago·Updated 9 months ago· 0
Text Label (SEB)
  • image
  • IMAGE
textYOUR TEXT
font_familyGoogle Sans Code Bold
font_size30
text_alignleft
placementtop_left
edge_offset25
color_schemewhite_on_black
padding18
corner_radius15
stroke_width1
background_opacity0

ComfyUI embeds the full workflow JSON into your PNG's metadata, which is great until someone screenshots it or uploads it to a site that strips metadata. Text Label (SEB) - class TextLabel - takes the opposite approach: it draws text directly onto the pixels. A caption, a watermark, or the pack's seed/steps/CFG/time overlay, burned in and impossible to remove. It's the third and final node in the KSampler Control chain, and it's also perfectly useful on its own.

How it works

Under the hood it's a PIL drawing job. Your image tensor becomes a PIL RGBA image, and the node:

  • Measures the text via the loaded font,
  • draws a rounded-rectangle background box (opacity controlled by background_opacity, 0–255),
  • composites that onto the image,
  • then draws the text on top, with an optional stroke outline.

It handles batches too - give it a batch of images and every one gets labeled. The single output is IMAGE, so it slots right before Save Image.

The settings that matter

You only need image and text - everything else has sane defaults. But two of them are worth knowing about because the defaults will trip you up:

  • background_opacity defaults to 0, meaning no background box at all. You get text floating directly on the image with a thin stroke. Bump it to ~180 if your text is vanishing into busy pixels.
  • placement gives you top_left, top_right, bottom_left, bottom_right, and center. The classic watermark spot - bottom right - is one click away.

Beyond that: font_size (6–256), edge_offset (distance from the image edge), padding and corner_radius for the box, stroke_width for the outline, text_align for multi-line text, and color_scheme which toggles white_on_black / black_on_white.

Fonts, and the Linux gotcha

The font_family dropdown has seven options, and the pack ships most of them in its fonts/ directory - Funnel Sans, Google Sans Code, Arial, Arial Bold, and Monospace are all bundled in the repo, so no downloads. The default is "Google Sans Code Bold", which looks clean and modern.

The gotcha: for fonts like Arial, the code falls back to system font paths when the bundled file isn't found. On a bare Linux box without mscorefonts installed, that fallback can land on ImageFont.load_default(), which is a tiny bitmap font that looks broken at any real size. If your label renders as a pixelated smear, pick a bundled font (Funnel Sans or Google Sans Code) rather than Arial - that's what they're there for. Don't use text you don't want machine-readable; this is raster text by design, so a long caption becomes a big block.

Install

Same one-liner as its siblings - no dependencies beyond what ComfyUI ships:

cd ComfyUI/custom_nodes/
git clone https://github.com/Seb-Lis/ComfyUI_Node_Pack

Restart, or grab it via ComfyUI Manager → Install Custom Nodes ("ComfyUI_Node_Pack"). You'll find "Text Label (SEB)" under image/annotation.

It works fine standalone - annotate comparison grids, label batch outputs, watermark your exports. But its natural home is this pack's chain: KSamplerControl captures the settings, GenerationTime appends the timing, and this node puts the whole story on the image before you save it.

Categoryimage/annotation

Inputs (12)

NameTypeDefaultDescription
imageIMAGE
textSTRINGYOUR TEXT
font_familyoptCOMBOGoogle Sans Code Bold7 options: Arial, Arial Bold, Monospace, Funnel Sans, Funnel Sans Bold, Google Sans Code, +1
font_sizeoptINT306–256
text_alignoptCOMBOleft3 options: left, center, right
placementoptCOMBOtop_left5 options: top_left, top_right, bottom_left, bottom_right, center
edge_offsetoptINT250–4096
color_schemeoptCOMBOwhite_on_black2 options: white_on_black, black_on_white
paddingoptINT180–256
corner_radiusoptINT150–128
stroke_widthoptINT10–20
background_opacityoptINT00–255

Outputs (1)

NameTypeDescription
IMAGEIMAGE