Nodes/Ultra Tools/Ultra Tools Text Watermark
ComfyUI Node

Ultra Tools Text Watermark

Two lines of text, 15 bundled fonts, and an outline that actually reads on any image

By Yamoon-jjangยทCreated 14 days agoยทUpdated 9 days agoยท 5
Ultra Tools Text Watermark
  • image
  • IMAGE
โ—„โ”€โ”€ ๐Ÿ”ค Fonts & Text โ”€โ”€โ–บ
โ—„First_TextCreated image byโ–บ
โ—„First_FontDancingScript-Bold.ttfโ–บ
โ—„First_Font_Size30โ–บ
โ—„First_Font_Colorgreenโ–บ
โ—„First_Alignrightโ–บ
โ—„First_StyleNoneโ–บ
โ—„First_Line_Spacing0โ–บ
โ—„First_Outline_Enabledtrueโ–บ
โ—„First_Outline_Width1โ–บ
โ—„First_Outline_Colorblackโ–บ
โ—„Second_Text๋„ˆ์˜ ์ด๋ฆ„์€โ–บ
โ—„Second_Fontํ–‰๋ณต๊ณ ํฅM.ttfโ–บ
โ—„Second_Font_Size50โ–บ
โ—„Second_Font_Colorwhiteโ–บ
โ—„Second_Alignrightโ–บ
โ—„Second_StyleNoneโ–บ
โ—„Second_Line_Spacing0โ–บ
โ—„Second_Outline_Enabledtrueโ–บ
โ—„Second_Outline_Width1โ–บ
โ—„Second_Outline_Colorblueโ–บ
โ—„โ”€โ”€ ๐Ÿงฉ Spacing โ”€โ”€โ–บ
โ—„Layout_Directionverticalโ–บ
โ—„Height_Align_Modemiddleโ–บ
โ—„Block_Spacing10โ–บ
โ—„โ”€โ”€ โœจ Glow โ”€โ”€โ–บ
โ—„First_Glow_Enabledtrueโ–บ
โ—„Second_Glow_Enabledtrueโ–บ
โ—„Glow_Colorwhiteโ–บ
โ—„Glow_Thickness5โ–บ
โ—„Glow_Blur5โ–บ
โ—„Glow_Opacity0.80โ–บ
โ—„โ”€โ”€ ๐ŸŽ›๏ธ Adjust โ”€โ”€โ–บ
โ—„Watermark_Opacity1.00โ–บ
โ—„Alignbottom rightโ–บ
โ—„Align_Offset0โ–บ
โ—„Align_Offset_X0โ–บ
โ—„Align_Offset_Y0โ–บ
โ—„Rotation0โ–บ

The shape of the thing

Most "add text to image" nodes give you one string, one font size, one colour, and one problem: white text on a white patch of sky that nobody can read. Then you go looking for an outline control and it doesn't exist.

Ultra Tools Text Watermark is built around a specific, common layout instead: two text blocks, generally a small credit line above a bigger signature or handle. Each block gets its own font, size, colour, alignment, style, line spacing and outline. Both can glow. The two blocks then lay out vertically or horizontally, with a 9-way anchor, offsets, global opacity, and rotation.

It's a finishing node. Image goes in, watermarked image comes out, one output. The one thing it isn't is a single-text stamper for a single corner - for that you can just leave the second block empty.

How it renders

Each block is drawn with Pillow, so the pipeline is: measure text with the chosen font, compose the block (multi-line via line spacing), apply outline as a stroke pass in the outline colour, optionally build a glow by dilating and blurring a mask outside the glyphs and compositing that in, apply per-block opacity, then place both blocks relative to the anchor with Block_Spacing between them. Rotation happens on the composed block, not on individual glyphs, which is why 90ยฐ rotations look tidy instead of ragged.

The glow deserves a note because it's the one effect that reliably looks bad if done lazily: it's generated from a mask that's grown outward from the text and blurred, then clipped to stay outside the glyphs, with a "visible threshold" that adapts to the glow thickness and overall opacity so a thin glow at 30% opacity still appears rather than fading into nothing.

Fonts come from the pack's own fonts/ folder - 15 of them, including Korean handwriting and brush styles and a few English script faces. Drop a .ttf in there and it shows up in the list. If the folder is empty the node falls back to scanning system fonts (capped at a sane number of files), so you can use an installed font instead.

The settings that matter

First_Text and Second_Text - the defaults are a sample credit line, replace both. Multi-line is fine.

First_Font / Second_Font, First_Font_Size / Second_Font_Size - sizes are in pixels. 30 and 50 are the defaults, and they're tuned for a ~1024px image. On a 4K upscale those become unreadably small; scale them or the whole watermark reads as grit.

First_Font_Color / Second_Font_Color - 16 named presets, no hex box, so you're picking from a fixed palette.

First_Outline_Enabled / Width / Color (and the Second equivalents) - on by default at width 1. Turn the width up before you turn the colour to something clever; 2โ€“3px black outline is what makes white text survive a bright background.

First_Glow_Enabled / Second_Glow_Enabled plus Glow_Color, Glow_Thickness, Glow_Blur, Glow_Opacity - the glow is shared, so both blocks glow the same way.

Layout_Direction (vertical / horizontal), Height_Align_Mode (top / middle / bottom), Block_Spacing.

Align (seven positions), Align_Offset for an even margin, Align_Offset_X / Align_Offset_Y for fine nudges, Watermark_Opacity, Rotation - ranges -180 to 180 in 15ยฐ steps.

Output is a single IMAGE.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/Yamoon-jjang/comfyui-Ultra-Tools

Manager โ†’ Ultra Tools works. Restart and Ctrl+F5. No pip installs - Pillow and numpy only. If you had the older standalone comfyui-Ultra-* packs installed, delete them; this unified pack registers the same node class names.

One licensing note that isn't in the node but is in the repo: the code is GPL-3.0, the fonts are not. Each bundled font keeps its own licence (see fonts/FONTS_LICENSE.md). Fine for putting text on your own images; check the file before redistributing the fonts themselves.

Problems you'll actually hit

Text vanishes on light images. Outline width 1 in black at 30px is not enough at high resolution. Raise size first, then outline width.

The font list is Korean-heavy. It is - the pack is Korean. If you want a specific Latin face, drop the .ttf into the pack's fonts/ folder; that's the supported path and it doesn't require editing anything.

The node isn't in the menu. Every module in this pack is imported in its own try/except and skipped with a console warning on failure, so a missing node is a warning in the startup log, not a crash. Check the console before you reinstall.

You want a tiled logo instead. That's Ultra Tools Image Watermark - this node only places text. The recommended chain is original โ†’ Image Watermark โ†’ Text Watermark โ†’ Save, which the author says explicitly and which matches how you'd do it by hand.

CategoryUltra Tools

Inputs (40)

NameTypeDefaultDescription
imageIMAGEโ€”
โ”€โ”€ ๐Ÿ”ค Fonts & Text โ”€โ”€STRINGโ€”
First_TextSTRINGCreated image byโ€”
First_FontCOMBODancingScript-Bold.ttf15 options: BinggraeSamanco-Bold.ttf, BinggraeSamanco.ttf, DancingScript-Bold.ttf, GreatVibes-Regular.ttf, NanumBarunpenB.ttf, NanumBarunpenR.ttf, +9
First_Font_SizeINT301โ€“256โ€”
First_Font_ColorCOMBOgreen16 options: white, black, red, green, blue, yellow, +10
First_AlignCOMBOright3 options: left, center, right
First_StyleCOMBONone8 options: None, Bold, Italic, Bold + Italic, Underline, Bold + Underline, +2
First_Line_SpacingINT0-5โ€“40โ€”
First_Outline_EnabledBOOLEANtrueโ€”
First_Outline_WidthINT10โ€“12โ€”
First_Outline_ColorCOMBOblack16 options: white, black, red, green, blue, yellow, +10
Second_TextSTRING๋„ˆ์˜ ์ด๋ฆ„์€โ€”
Second_FontCOMBOํ–‰๋ณต๊ณ ํฅM.ttf15 options: BinggraeSamanco-Bold.ttf, BinggraeSamanco.ttf, DancingScript-Bold.ttf, GreatVibes-Regular.ttf, NanumBarunpenB.ttf, NanumBarunpenR.ttf, +9
Second_Font_SizeINT501โ€“256โ€”
Second_Font_ColorCOMBOwhite16 options: white, black, red, green, blue, yellow, +10
Second_AlignCOMBOright3 options: left, center, right
Second_StyleCOMBONone8 options: None, Bold, Italic, Bold + Italic, Underline, Bold + Underline, +2
Second_Line_SpacingINT0-5โ€“40โ€”
Second_Outline_EnabledBOOLEANtrueโ€”
Second_Outline_WidthINT10โ€“12โ€”
Second_Outline_ColorCOMBOblue16 options: white, black, red, green, blue, yellow, +10
โ”€โ”€ ๐Ÿงฉ Spacing โ”€โ”€STRINGโ€”
Layout_DirectionCOMBOvertical2 options: vertical, horizontal
Height_Align_ModeCOMBOmiddle3 options: top, middle, bottom
Block_SpacingINT100โ€“600โ€”
โ”€โ”€ โœจ Glow โ”€โ”€STRINGโ€”
First_Glow_EnabledBOOLEANtrueโ€”
Second_Glow_EnabledBOOLEANtrueโ€”
Glow_ColorCOMBOwhite16 options: white, black, red, green, blue, yellow, +10
Glow_ThicknessINT50โ€“20โ€”
Glow_BlurINT50โ€“30โ€”
Glow_OpacityFLOAT0.800โ€“1โ€”
โ”€โ”€ ๐ŸŽ›๏ธ Adjust โ”€โ”€STRINGโ€”
Watermark_OpacityFLOAT1.000โ€“1โ€”
AlignCOMBObottom right7 options: center, top left, top center, top right, bottom left, bottom center, +1
Align_OffsetINT00โ€“2048โ€”
Align_Offset_XINT0-2048โ€“2048โ€”
Align_Offset_YINT0-2048โ€“2048โ€”
RotationFLOAT0-180โ€“180โ€”

Outputs (1)

NameTypeDescription
IMAGEIMAGEโ€”