Nodes/Quick Watermark/Quick Watermark Video
ComfyUI Node

Quick Watermark Video

Watermark every frame of a video in one node — no ffmpeg, no per-frame fuss

By boobkake22·Created 4 months ago·Updated a day ago· 1
Quick Watermark Video
  • image
  • watermark
  • watermark_mask
  • image
watermark_preset
alignment
offset_percentage2.0
resize_percentage20.0
opacity60

You've just finished a WAN, LTX, or Hunyuan clip you're proud of, and you want your logo on it before it goes anywhere. In ComfyUI that used to mean a tedious detour: export the video, run an ffmpeg overlay command, re-import. Quick Watermark Video collapses all of that into a single node you drop in the graph between your generation and your save.

The name is the honest part: it's "Quick." It doesn't call an API, needs no key, downloads no models, and installs with zero extra dependencies. It's a pure per-frame composite - the kind of small, single-purpose utility node the ComfyUI ecosystem is stuffed with and every workflow needs once it leaves the toy stage.

How it works

The trick that makes it work on video is a ComfyUI convention: video frames are just an IMAGE tensor with the frames stacked along the batch dimension. A 121-frame LTX clip isn't "a video" to the graph - it's a [121, H, W, 3] image batch. This node iterates that batch and alpha-composites a watermark onto every frame, then hands back the same-shaped IMAGE for you to save.

Under the hood (the source is a single ~350-line file, worth a skim if you're curious) it resizes the watermark to a percentage of the frame width, builds an alpha channel, and blends per frame with a plain source * alpha + target * (1 - alpha). All torch, on the same device as your frames - no CPU round-trip, so a 100-frame batch stamps in well under a second.

The inputs that matter

  • image (required) - your frames, from a video decode, an image-to-video model, or even a single still. Anything that's an IMAGE.
  • watermark_preset - speaker-white or speaker-black, two built-in speaker-icon PNGs shipped with the pack. Good for a quick "sound on" badge or just testing the layout before you plug in your real logo.
  • watermark (optional) - your actual PNG from Load Image. When connected it overrides the preset.
  • watermark_mask (optional) - the mask output from Load Image. See the trap below.
  • alignment - nine positions, from top-left through center to bottom-right. Default is bottom-right, which is where you'll want it.
  • offset_percentage (default 2) - margin from the chosen edge, as a percentage of the frame size, not pixels. On a 1024-wide frame that's ~20px.
  • resize_percentage (default 20) - watermark width as a percentage of frame width. Your logo probably wants 8–15; crank it toward 200 if you want a full-width band.
  • opacity (default 60, 0–100) - global transparency. Drop it and your watermark sits politely in the corner instead of shouting.

It outputs a single image (IMAGE) - the watermarked batch. Wire it into a video-save node like VHS Save Video or ComfyUI's own Save Animated WEBP and you're done.

Install

Easiest via ComfyUI Manager - search "Quick Watermark." Or, the manual way:

cd ComfyUI/custom_nodes
git clone https://github.com/boobkake22/ComfyUI-QuickWatermark

Restart ComfyUI. That's the whole install: there's no requirements.txt, and the code only needs torch, numpy, and PIL, which ComfyUI already ships. The node appears under image/watermark as "Quick Watermark Video."

Where people get burned

The one real trap is PNG alpha. ComfyUI's Load Image deliberately splits a PNG's transparency off into its separate mask output - the image you get is RGB. Connect only Load Image.image to watermark and this node treats the logo as fully opaque, and you'll render a hard rectangle over your footage. Fix: wire Load Image.mask into watermark_mask too. The built-in presets handle their own alpha automatically; only your custom image needs the mask.

A couple of smaller notes. If opacity is 0 it short-circuits and returns your frames untouched - handy for A/B-ing layout. The watermark batch must be a single image or match your frame count exactly, so no per-frame logos unless you build a matching batch first. And one honest caveat: the "Video" in the name means it operates on video frames - it won't encode anything. And it's visible branding, not steganography; if you need to prove ownership invisibly, this isn't that tool. For slapping your name on a clip before it leaves ComfyUI, it's the node you actually reach for.

Categoryimage/watermark

Inputs (8)

NameTypeDefaultDescription
imageIMAGE
watermark_presetCOMBO2 options: speaker-white, speaker-black
alignmentCOMBO9 options: bottom-right, center, top-center, top-left, top-right, center-right, +3
offset_percentageFLOAT2.00–100
resize_percentageFLOAT20.00.1–200
opacityFLOAT600–100
watermarkoptIMAGE
watermark_maskoptMASK

Outputs (1)

NameTypeDescription
imageIMAGE