Ultra Tools Text Watermark
Two lines of text, 15 bundled fonts, and an outline that actually reads on any image
- image
- IMAGE
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.
Inputs (40)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | โ | |
| โโ ๐ค Fonts & Text โโ | STRING | โ | |
| First_Text | STRING | Created image by | โ |
| First_Font | COMBO | DancingScript-Bold.ttf | 15 options: BinggraeSamanco-Bold.ttf, BinggraeSamanco.ttf, DancingScript-Bold.ttf, GreatVibes-Regular.ttf, NanumBarunpenB.ttf, NanumBarunpenR.ttf, +9 |
| First_Font_Size | INT | 301โ256 | โ |
| First_Font_Color | COMBO | green | 16 options: white, black, red, green, blue, yellow, +10 |
| First_Align | COMBO | right | 3 options: left, center, right |
| First_Style | COMBO | None | 8 options: None, Bold, Italic, Bold + Italic, Underline, Bold + Underline, +2 |
| First_Line_Spacing | INT | 0-5โ40 | โ |
| First_Outline_Enabled | BOOLEAN | true | โ |
| First_Outline_Width | INT | 10โ12 | โ |
| First_Outline_Color | COMBO | black | 16 options: white, black, red, green, blue, yellow, +10 |
| Second_Text | STRING | ๋์ ์ด๋ฆ์ | โ |
| Second_Font | COMBO | ํ๋ณต๊ณ ํฅM.ttf | 15 options: BinggraeSamanco-Bold.ttf, BinggraeSamanco.ttf, DancingScript-Bold.ttf, GreatVibes-Regular.ttf, NanumBarunpenB.ttf, NanumBarunpenR.ttf, +9 |
| Second_Font_Size | INT | 501โ256 | โ |
| Second_Font_Color | COMBO | white | 16 options: white, black, red, green, blue, yellow, +10 |
| Second_Align | COMBO | right | 3 options: left, center, right |
| Second_Style | COMBO | None | 8 options: None, Bold, Italic, Bold + Italic, Underline, Bold + Underline, +2 |
| Second_Line_Spacing | INT | 0-5โ40 | โ |
| Second_Outline_Enabled | BOOLEAN | true | โ |
| Second_Outline_Width | INT | 10โ12 | โ |
| Second_Outline_Color | COMBO | blue | 16 options: white, black, red, green, blue, yellow, +10 |
| โโ ๐งฉ Spacing โโ | STRING | โ | |
| Layout_Direction | COMBO | vertical | 2 options: vertical, horizontal |
| Height_Align_Mode | COMBO | middle | 3 options: top, middle, bottom |
| Block_Spacing | INT | 100โ600 | โ |
| โโ โจ Glow โโ | STRING | โ | |
| First_Glow_Enabled | BOOLEAN | true | โ |
| Second_Glow_Enabled | BOOLEAN | true | โ |
| Glow_Color | COMBO | white | 16 options: white, black, red, green, blue, yellow, +10 |
| Glow_Thickness | INT | 50โ20 | โ |
| Glow_Blur | INT | 50โ30 | โ |
| Glow_Opacity | FLOAT | 0.800โ1 | โ |
| โโ ๐๏ธ Adjust โโ | STRING | โ | |
| Watermark_Opacity | FLOAT | 1.000โ1 | โ |
| Align | COMBO | bottom right | 7 options: center, top left, top center, top right, bottom left, bottom center, +1 |
| Align_Offset | INT | 00โ2048 | โ |
| Align_Offset_X | INT | 0-2048โ2048 | โ |
| Align_Offset_Y | INT | 0-2048โ2048 | โ |
| Rotation | FLOAT | 0-180โ180 | โ |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | โ |