πΌ Image Watermark
Your logo goes on at save time, not into the image tensor
- Watermark
If you post generated images anywhere - a gallery, a client folder, a subreddit - you eventually want your handle on them. The usual advice in the community is "install Comfyroll, it has watermark nodes," and that's fine. But if you're already running a batch of forty renders overnight, doing the stamping in the graph is the whole point: nobody's opening Photoshop at 3am.
πΌ Image Watermark is the image-based half of Avaray/honda-nodes' watermarking pair. You point it at a PNG with transparency, set opacity, size, corner and margin, and it produces a HONDA_WATERMARK object. That object does nothing by itself. It gets applied by the pack's own πΌ Save Image node at the moment the file is written.
The mechanism, because it explains everything else
The node doesn't composite anything. Open the source and it's about fifteen lines: load the file with PIL, pack it into a dictionary with the type, opacity, scale, position and margin, return it. The actual compositing happens inside Honda_SaveImage, which converts the tensor to a PIL image, builds a transparent overlay, resizes your watermark to scale with LANCZOS, multiplies its alpha channel by opacity, pastes it at the computed corner, and alpha-composites the two before encoding.
Two consequences follow, and they're both things people hit:
- The watermark is not in the image tensor. Any Preview node upstream of the save shows you the clean image. You will only see the stamp in the saved file.
HONDA_WATERMARKis a custom type. CoreSaveImagehas no socket for it and never will. It connects toβ‘οΈ Honda Nodes/πΌ Image β Save Image, and to nothing else in the pack - I checked every consumer. If the only save node you own is ComfyUI's default, this node is a dead end.
Inputs that matter
File Name - the watermark file's name as it sits in ComfyUI/input/. Drop your logo PNG there (or upload it via any load-image node once) and type the filename. It supports transparency, so a transparent PNG is what you want, not a white-background JPEG.
Opacity - 0 to 1, default 0.7. Note the default is fairly strong; a busy logo at 0.7 over a detailed image reads as a sticker. 0.35β0.5 is where most watermarks look like watermarks.
Scale - default 1.0, meaning the watermark keeps its native pixel size. This is the setting that surprises people, because it's not "relative to the image" - a 1200px-wide logo pasted onto a 1024px-wide render will swallow the whole frame. Think in absolute pixels: if your output is 1024 wide and you want a logo about 15% of that width, scale a 1200px logo down to roughly 0.13.
Position - bottom_right, bottom_left, top_right, top_left, or center. Margin (px) is the inset from the edges, 0β512, default 16.
Path Override (optional) - an absolute path to the watermark file, which takes priority over the picker. It's handy for a logo that lives outside ComfyUI's input folder; the node copies the file into input/ so the front end can still render its thumbnail preview.
Output
Watermark, type HONDA_WATERMARK. Wire it into the watermark input of the pack's Save Image node. Save Image writes whatever formats you've enabled - PNG, JPG, WebP - and applies the watermark to each one, so the stamp is baked into every file that run produces.
Install
cd ComfyUI/custom_nodes
git clone --depth 1 https://github.com/Avaray/honda-nodes.git
cd honda-nodes
python install.py
Or via ComfyUI Manager: search Honda Nodes in Node Pack, install, restart. The installer downloads the author's ime binaries and jq into the pack's bin/ folder - not needed for watermarking, but required by the metadata nodes. On Windows the README's equivalent is:
..\..\..\python_embeded\python.exe install.py
The pack needs ComfyUI 0.38.0 or newer (it's built on the V3 schema), and PIL/numpy which you already have.
Common issues
"Image not found." The file isn't where the node is looking. File Name is resolved against ComfyUI/input/, not your output folder, not your desktop. Absolute paths go in Path Override.
Execution blocked with "Please select a watermark image". Both the filename and the override are empty - the node stops the run rather than silently saving unwatermarked files.
Nothing appears on the image. Check which save node you used. If you wired into core Save Image, the socket wouldn't even have accepted it; if you're previewing an upstream node, the watermark isn't there yet. Look at the actual file in output/.
It's enormous, or microscopic. Scale is absolute, not proportional. Set it from your output resolution, not your mood.
You want it to tile, rotate, or sit diagonally. It won't. This is a corner paste with an alpha, nothing else - for anything fancier you need a compositing node and a spare afternoon.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| image_file | STRING | Name of the watermark image file in the input directory. | |
| opacity | FLOAT | 0.700β1 | β |
| scale | FLOAT | 1.000.01β10 | Scaling factor applied to the watermark image before compositing. |
| position | COMBO | bottom_right | 5 options: bottom_right, bottom_left, top_right, top_left, center |
| margin | INT | 160β512 | β |
| path_overrideopt | STRING | Absolute path to an image file. If provided, overrides the picker above. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| Watermark | HONDA_WATERMARK | β |