Image with FX
Watermark and logo compositing with glow, shadow, and one infuriating toggle
- background_image
- input_image
- mask
- image
- mask
This is the node you reach for when your output is done and you want to slap a logo, signature, or watermark on it - with the option to make it look deliberate instead of pasted on. Image with FX composites one image onto another using a mask (or the image's own alpha) as the shape, then optionally dresses it up with an outer glow and a drop shadow. It's the kind of post-processing nobody thinks to search for until they need to brand 200 batch outputs at once.
How the compositing works
You give it a background_image and an input_image (logo, signature, whatever), and the node figures out the shape of the input from either the mask you connect or the image's alpha channel if you don't. That shape drives the whole composite: it's what gets pasted, what gets the glow, and what casts the shadow. The source resizes to image_scale percent of the background (100% = fits entirely inside it; lower values are your watermark territory), then anchors it at position - default bottom_right - with margin_x/margin_y offsets, at opacity percent. Two outputs come out: the composited image and a mask, so you can chain further processing or save both.
The toggle that will trip you up
invert_mask defaults to True, and it's the first thing to suspect when your logo comes out looking like a hole punched in the background. The logic: many masks - especially white-on-black ones where the shape is white and the surroundings are black - are "inverted" relative to what the compositor expects, so the node flips them by default. If your logo renders as a cutout or a weird negative, flip invert_mask off and watch it fix itself in one rerun. The tooltip spells it out: enable it when the mask is white-on-black (transparent inside).
The FX inputs worth knowing
- Glow:
enable_glowturns it on.glow_intensity(default 5) is buildup iterations - more is denser;glow_rangeis max expansion in pixels;glow_bluris the blur radius per step; andglow_inner_color/glow_outer_colorare hex colors, defaulting to a cyan→blue fade. If you want a neon look, start here. - Shadow:
enable_shadowfor the drop shadow behind the shape.shadow_offset_x/yposition it,shadow_growexpands it beyond the outline,shadow_blursoftens it,shadow_color(default#000000) andshadow_opacity(default 50) finish it. - Positioning:
image_scale,opacity,position,margin_x,margin_y. That's the core of a simple watermark: scale ~10–20, opacity ~40–60, bottom right, small margins.
The author's own tip from the tooltips: if you don't have a separate background, connect the same image to both the background and input slots and the node handles it.
Install
It's part of ComfyUI_Eclipse, so one install gets you this and every other node in the pack:
cd ComfyUI/custom_nodes
git clone https://github.com/r-vage/ComfyUI_Eclipse
or install ComfyUI_Eclipse from ComfyUI Manager and restart. It runs on Pillow and numpy, both already in the pack's requirements, so there's usually nothing extra to install. Realistic use: wire the output into a Save Images or Preview node at the end of your workflow, and you've got an automatic watermark stage that runs every batch. It's fiddly to get the mask polarity right the first time, but once you've flipped invert_mask once, you'll never think about it again.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| background_image | IMAGE | Background image. The input image is composited onto this. Tip: connect the same image to both slots if you don't have a separate background. | |
| input_image | IMAGE | Image to composite (logo, signature, watermark). | |
| invert_mask | BOOLEAN | true | Invert the mask so the opaque areas become the shape. Enable when the mask is white-on-black (transparent inside). |
| image_scale | INT | 251–500 | Scale percentage. 100%% = input fits entirely within the background. Use lower values for watermarks. |
| opacity | INT | 1000–100 | Overall opacity of the composited image. 100 = fully visible, 0 = invisible. |
| position | COMBO | bottom_right | Anchor position of the image on the canvas. |
| margin_x | INT | 200–4000 | Horizontal margin from the anchor edge. |
| margin_y | INT | 100–4000 | Vertical margin from the anchor edge. |
| enable_glow | BOOLEAN | false | Enable outer glow effect around the image. |
| glow_intensity | INT | 52–20 | Glow buildup iterations (more = denser glow). |
| glow_range | INT | 251–500 | Maximum glow expansion distance in pixels. |
| glow_blur | INT | 150–500 | Blur radius applied to each glow step. |
| glow_inner_color | STRING | #2ec0ff | Glow color near the image (inner, hex). |
| glow_outer_color | STRING | #006eff | Glow color at the edge (outer, hex). |
| enable_shadow | BOOLEAN | false | Enable drop shadow effect behind the image. |
| shadow_offset_x | INT | 5-500–500 | Shadow horizontal offset in pixels. |
| shadow_offset_y | INT | 5-500–500 | Shadow vertical offset in pixels. |
| shadow_grow | INT | 60–200 | Shadow expansion beyond image outline. |
| shadow_blur | INT | 180–200 | Shadow blur radius. |
| shadow_color | STRING | #000000 | Shadow color (hex). |
| shadow_opacity | INT | 500–100 | Shadow opacity percentage. |
| maskopt | MASK | Shape mask for the input image. If omitted, the image alpha channel is used. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |