Nodes/comfy-ovum/Text Ovary
ComfyUI Node

Text Ovary

Captions, watermarks and credits stamped straight onto images

By sfinktah·Created about a year ago·Updated 10 months ago· 7
Text Ovary
  • image
  • IMAGE
textHello
font_size32
font
fill_color_hex#FFFFFF
stroke_color_hex#000000
stroke_thickness0.20
padding16
horizontal_alignmentcenter
vertical_alignmentbottom
x_shift0
y_shift0
line_spacing4.0
stroke_opacity0.4

Text Ovary overlays styled text on your images - captions, watermarks, frame labels, credits - with fonts, fill and stroke colors, alignment, padding, and per-batch rendering. Plug in an IMAGE and a STRING, pick a font, done. It's the pack's polished in-house merge of the author's own comfyui-textoverlay node, adapted and cleaned up.

When you'd reach for it

You've rendered a batch and want every image stamped with a label - "frame 042", a watermark, a style name, the seed for reproducibility. Pair it with a format node to build the text dynamically from metadata and you get a self-documenting contact sheet. It renders the same text across a whole batch efficiently, which is the part that makes it genuinely useful for video frames or large batches rather than a novelty.

How it works

PIL does the heavy lifting: your tensor gets converted to an image, an RGBA overlay layer is drawn, and the text is composited. The stroke thickness is relative to font size (a 0.2 default means 20% of the font size as outline width), and the stroke has its own opacity slider so you can make captions readable over busy backgrounds without a hard black box.

Colors are flexible: fill and stroke accept hex (#FFFFFF, and short forms like #fff) or named colors via matplotlib's color table - so "white", "red", "yellow" all work.

The inputs that matter

You'll actually touch maybe five of these on day one:

  • image (IMAGE, required) - what to stamp on. The node processes it directly, one image or a whole batch.
  • text (STRING, multiline) - supports real line breaks, so multi-line captions just work.
  • font_size (INT, default 32) - the headline control.
  • horizontal_alignment / vertical_alignment - left/center/right, top/middle/bottom (defaults: center, bottom).
  • fill_color_hex and stroke_color_hex - text color and outline color.

Beyond those: stroke_thickness, stroke_opacity, padding, x_shift/y_shift for nudges, line_spacing, and font (a dropdown of available fonts). Output is a single IMAGE with the text composited.

Installing it

Part of the comfy-ovum pack:

cd ComfyUI/custom_nodes
git clone https://github.com/sfinktah/comfy-ovum

Restart ComfyUI, or use ComfyUI Manager → search "comfy-ovum" → Install. Text Ovary needs Pillow and numpy, both in the pack's requirements.

Common gotchas

  • The font dropdown has a hidden dependency. The pack reads its font list from a sibling comfyui-textoverlay install (custom_nodes/comfyui-textoverlay/fonts). If that's missing, the list falls back to DejaVuSans.ttf, and if even that can't load, you get Pillow's default bitmap font - which looks chunky and low-res. If your fonts look wrong, install comfyui-textoverlay alongside the pack.
  • Stroke thickness is relative, not absolute. It's a fraction of font size, so a 0.2 stroke on a 32px font and a 96px font are very different widths. That's intentional, but it surprises people at large sizes.
  • The text input is where the action is. If your caption is coming from upstream, make sure it's a plain STRING - lists or numbers may need a format node first.
Categoryimage/text

Inputs (14)

NameTypeDefaultDescription
imageIMAGE
textSTRINGHello
font_sizeINT321–9999
fontCOMBO1 options: DejaVuSans.ttf
fill_color_hexSTRING#FFFFFF
stroke_color_hexSTRING#000000
stroke_thicknessFLOAT0.200–1
paddingINT160–128
horizontal_alignmentCOMBOcenter3 options: left, center, right
vertical_alignmentCOMBObottom3 options: top, middle, bottom
x_shiftINT0-128–128
y_shiftINT0-128–128
line_spacingFLOAT4.00–50
stroke_opacityFLOAT0.40–1

Outputs (1)

NameTypeDescription
IMAGEIMAGE