Add Watermark
Stamp an image or text mark, positioned and styled
- image
- watermark
- watermark_mask
- image
If you're generating anything you plan to post publicly - samples for a shop, previews before a paid release, anything you want traced back to you - this is the node that stamps your mark on it directly inside the graph, instead of round-tripping through an external editor after every batch. It's the sibling of RemoveWatermarkNode in the same pack, doing the opposite job: putting one on rather than taking one off.
How it works
One node, two modes, switched by a single toggle. Set image_watermark to true and it composites a picture (your logo, say) onto the output at a position, scale, and opacity you control. Set it false and it switches to drawing text instead, with its own color and font controls. Either way you get position, size, and transparency control, which covers the three things you actually care about when branding an image: where it sits, how big it is, and how much it fights with the underlying picture.
The inputs and outputs that matter
Required on every run, regardless of mode:
image- the picture getting watermarked.image_watermark(boolean, default true) - the mode switch: true uses an image watermark, false switches to a text watermark.position_X/position_Y- pixel coordinates for where the watermark sits, 0–10000, default 0 (top-left corner).opacity(0–1, default 1) - how transparent the watermark is. 1 is fully opaque.scale(0.1–10, default 1) - resizes the watermark relative to its source size.
Then a set of optional inputs, which map to whichever mode you picked:
watermark(IMAGE) andwatermark_mask(MASK) - used whenimage_watermarkis true. Feed it the logo image (and, if it needs one, a mask so the watermark composites cleanly rather than as a hard rectangle).text(default"enter text"),text_color(default#FFFFFF, white), andfonts- used whenimage_watermarkis false. Thefontsdropdown ships with eleven options out of the box, a mix of Latin display faces (blackrumbleregular, fadeaway, millionastter, showdex, xangdashiny) and several Chinese calligraphy/decorative fonts bundled by the author.
One output: image, the watermarked result.
How to install it
Via ComfyUI Manager: search "ComfyUI-MingNodes," install, restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/mingsky-ai/ComfyUI-MingNodes
then restart. No model downloads or API keys needed - this one's self-contained.
Want your own font instead of the bundled eleven? Per the README, drop your own .ttf file into the fonts folder inside the plugin's directory (ComfyUI/custom_nodes/ComfyUI-MingNodes/fonts/) and restart ComfyUI - it'll show up in the fonts dropdown alongside the defaults.
Common issues & troubleshooting
Text watermark isn't showing, or the image watermark isn't showing. Check that image_watermark is actually set to the mode you meant - it's a single toggle covering both paths, so if you filled in text but left image_watermark at its default true, the node's looking for an image on the watermark input instead and ignoring your text fields entirely (and vice versa).
Watermark position looks off, or it's placed outside the visible image. position_X/position_Y go up to 10000, which is far larger than most image dimensions - nothing stops you from entering coordinates that place the watermark entirely off-canvas. Match your position values to your actual output resolution.
Custom font doesn't appear in the dropdown after adding the .ttf file. Restart ComfyUI - custom nodes generally scan their asset folders (fonts, models) at startup, not live, so a font dropped in mid-session won't show up until the next restart.
Watermark looks pasted-on, with a hard edge. If you're using the image-watermark mode, feed a proper watermark_mask alongside the watermark image so the edges composite smoothly instead of as a rectangle, and back opacity off a bit - a fully opaque logo at 100% tends to look more like a sticker than a mark.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| image_watermark | BOOLEAN | true | — |
| position_X | INT | 00–10000 | — |
| position_Y | INT | 00–10000 | — |
| opacity | FLOAT | 1.00–1 | — |
| scale | FLOAT | 1.00.1–10 | — |
| watermarkopt | IMAGE | — | |
| watermark_maskopt | MASK | — | |
| textopt | STRING | enter text | — |
| text_coloropt | STRING | #FFFFFF | — |
| fontsopt | COMBO | 11 options: blackrumbleregular.ttf, fadeaway.ttf, millionastter.ttf, showdex.ttf, xangdashiny.ttf, 华光布兜体.ttf, +5 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |