Nodes/MKRShift_Nodes/Image Watermark
ComfyUI Node

Image Watermark

Batch text + logo watermarking with real control

By criskb·Created 7 months ago·Updated 5 months ago· 0
Image Watermark
  • image
  • watermark_image
  • image
  • summary
text
text_size28
text_color#FFFFFF
text_bg_color#000000
text_bg_opacity0.35
positionbottom_right
margin24
watermark_opacity0.80
logo_scale0.20
logo_rotation_deg0.0

When you're churning out a batch of promo frames or client previews, slapping a visible credit on each one is a chore you should never do by hand. MKRImageWatermark is the pack's visible watermark node: it stamps text (with or without a background bar), overlays an optional logo, and handles whole batches in one pass. If the pack's invisible watermark nodes are for provenance you can't see, this one is for the brand mark you want the viewer to see.

How it works

You hand it an image batch, and it stamps every frame consistently: same text, same position, same size, same opacity. The text rendering has the controls you'd expect - text, text_size, text_color, text_bg_color, and text_bg_opacity (default 0.35), so you can get a legible label on any background by giving it a dark bar to sit on. position is one of five presets (bottom-right, bottom-left, top-right, top-left, center) with a margin in pixels. watermark_opacity (default 0.8) sets how strong the whole composite is.

The logo path is where it gets interesting. Connect a watermark_image and it's scaled to logo_scale (a fraction of the frame size, default 0.2) and rotated by logo_rotation_deg, then composited alongside or instead of the text. The logo is resized relative to the base image, so the same settings scale correctly across frames of different sizes - which is the kind of detail that makes batch watermarks actually usable instead of per-image fiddling.

Inputs that matter

  • image - required. The whole batch gets stamped.
  • text - required-ish: if both text and watermark_image are empty/absent, the node returns the input unchanged with a warning rather than doing nothing silently.
  • watermark_image - optional logo overlay.
  • Everything else - size, color, position, opacity, scale, rotation - is cosmetic, and the defaults are sane for a bottom-right credit at 28 px.

Outputs

  • image - the watermarked batch, same dimensions, same batch count.
  • summary - frame count, whether text and/or logo were used, and position. Handy for confirming a batch actually got stamped.

Installing it

Part of the pack:

# ComfyUI Manager: search "MKRShift Nodes", install, restart.
# or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
# restart ComfyUI

No extra dependencies, no models. Text rendering uses Pillow's built-in fonts, so there's nothing to download.

Gotchas and honest limits

A few practical notes. First, if the node warns "No text or watermark_image provided, returning input unchanged," that's your cue - it's not broken, you just didn't give it anything to stamp. Second, since it processes the whole batch identically, position presets are relative to the frame - fine for a consistent look, but if your frames have very different aspect ratios, the watermark's visual weight will drift (bottom-right on a square frame sits differently than on a 16:9 one). There's no per-frame smart placement here; for that you'd composite manually.

And the honest caveat about visible watermarks generally: they protect against casual copying, not against anyone with ten minutes and a crop tool. This node makes the mark look professional and consistent - the rest is on your licensing terms. For a mark people won't even see, that's what MKRInvisibleImageWatermark is for.

CategoryMKRShift Nodes/Media/Watermark

Inputs (12)

NameTypeDefaultDescription
imageIMAGE
textSTRING
text_sizeINT288–512
text_colorSTRING#FFFFFF
text_bg_colorSTRING#000000
text_bg_opacityFLOAT0.350–1
positionCOMBObottom_right5 options: bottom_right, bottom_left, top_right, top_left, center
marginINT240–2048
watermark_opacityFLOAT0.800–1
logo_scaleFLOAT0.200.02–1
logo_rotation_degFLOAT0.0-180–180
watermark_imageoptIMAGE

Outputs (2)

NameTypeDescription
imageIMAGE
summarySTRING