Nodes/comfyui-jk-easy-nodes/JK Easy Watermark
ComfyUI Node

JK Easy Watermark

Stamp a logo or text onto generated images

By kostenickj·Created 2 years ago·Updated 2 years ago· 8
JK Easy Watermark
  • image
  • logo_image
  • mask
  • IMAGE
watermark_text
fontassets/fonts/DMSans-VariableFont_opsz,wght.ttf
font_size16
logo_scale_percentage30
x_padding20
y_padding20
opacity40
positionbottomright

A straightforward branding node: give it an image and either a logo, some text, or both, and it stamps that onto the output with configurable position, size, and transparency. Nothing exotic here - it's the kind of node you add at the very end of a pipeline, right before saving, once you're actually shipping images somewhere and want your name (or a client's) on them.

The inputs and outputs that matter

Only image is required - everything else is optional, and the node does nothing visible if you leave it all blank.

  • watermark_text - plain text to stamp on the image. Pairs well with JKEasyCheckpointLoader's CKPT_NAME output if you want the watermark to automatically say which model made the image, rather than typing a static string.
  • logo_image - an image to overlay instead of, or alongside, text.
  • font - defaults to a font bundled with the pack itself (assets/fonts/DMSans-VariableFont...), so text watermarking works out of the box with no extra font install. You can point it at a different font file path if you want your own.
  • font_size (default 16) - self-explanatory.
  • logo_scale_percentage (default 30) - how big the logo renders relative to the source image.
  • position (topleft / bottomleft / topright / bottomright, default bottomright) - the standard four-corner placement most watermark tools offer.
  • x_padding / y_padding (default 20 each) - distance from the edge.
  • opacity (default 40) - how see-through the watermark is; lower values are more subtle, higher values are more assertive.
  • mask - an optional mask, presumably to restrict where the watermark can be drawn, if you need it to avoid a specific region of the image.

Output is IMAGE, and notably it's a list output (is_list: true) rather than a single image - worth knowing if you're chaining it into something that expects a single image versus a batch; you may need a batch/list handling node depending on what's downstream.

Installing it

Part of the kostenickj/jk-comfyui-helpers pack - pre-installed on comfy.icu's shared image, or cd ComfyUI/custom_nodes && git clone https://github.com/kostenickj/jk-comfyui-helpers.git and restart if self-hosting. The bundled font means you don't need to hunt down a font file yourself just to get text watermarking working, which is a small but genuinely convenient default. Nothing else here needs a model download. As with the rest of this pack, it's a small, low-visibility personal toolkit - expect the README and the node's field names to be your main reference, not a community thread.

Common issues

  • Text watermark looks tiny or huge relative to the image. font_size is a fixed pixel value, not relative to image size - if you're running this across images of very different resolutions, you may need to adjust it per batch or accept that it looks proportionally different on a 512px versus a 2048px image.
  • Watermark barely visible or way too strong. Tune opacity - 40 is a moderate default, drop it for subtlety, raise it if it's getting lost against a busy background.
  • Logo watermark output is a list, not a single image, and something downstream errors. Check whether the next node in your chain expects a batch/list or a single IMAGE, and add a batch-handling node if needed.
  • Custom font not loading. Double-check the path in font actually resolves from wherever ComfyUI is running - a relative path that worked on one machine won't necessarily resolve the same way elsewhere.
CategoryJK Comfy Helpers

Inputs (11)

NameTypeDefaultDescription
imageIMAGE
logo_imageoptIMAGE
maskoptMASK
watermark_textoptSTRING
fontoptSTRINGassets/fonts/DMSans-VariableFont_opsz,wght.ttf
font_sizeoptINT161–256
logo_scale_percentageoptINT301–100
x_paddingoptINT200–16384
y_paddingoptINT200–16384
opacityoptFLOAT400–100
positionoptCOMBObottomright4 options: topleft, bottomleft, topright, bottomright

Outputs (1)

NameTypeDescription
IMAGEIMAGE