Layer Blend
The Photoshop Blend Modes ComfyUI Never Shipped
- image_a
- image_b
- image
You've got two images that should be one image. A graded copy of your render you only half like, a blur you want to screen back over the original for a glow, a noise texture you want to lay across a flat sky. ComfyUI core gives you alpha composites and not much else, so people bounce out to Photoshop or GIMP for a five-second operation. Layer Blend is that operation, as a node: two images in, a blend mode and an opacity, one image out.
It's the least glamorous node in the pack - and honestly the one I'd miss more if it disappeared.
How it blends
The mechanism is straight compositing math, the same formulas Photoshop and GIMP use, done in numpy on float tensors in the 0–1 range:
- normal - the top layer wins outright.
- multiply -
a * b, always darkens. - screen -
1 - (1-a)(1-b), always lightens. This is your bloom/glow mode. - overlay - multiply on the dark half of the base, screen on the light half, so contrast doubles.
- soft_light - the gentle version of overlay. The one you actually want most of the time.
- hard_light - the harsh version, keyed off the top layer instead of the base.
- add, subtract, difference - arithmetic, clipped to 0–1.
image_a is the base, image_b is the top layer - the node's own description says so, and the math assumes it. Then opacity is a plain linear crossfade back toward the base: at 0 you get image_a untouched, at 100 you get the full blend, at 35 you get a restrained version of it. That crossfade is the reason this node beats a "multiply" toggle elsewhere: you can dial the effect instead of accepting it whole.
Two behaviors worth knowing before they bite you. Batches are truncated to the shorter input - 8 frames on A and 4 on B gives you 4 frames out, silently. And if the resolutions differ, image_b is resized to image_a's size with bilinear filtering, so a smaller top layer goes soft on the way up.
There's also no mask input. This is a whole-frame blend, not a compositing operation with a matte - for "put the subject on the new background" you want core's ImageCompositeMasked, not this.
Inputs and outputs
image_a (base) and image_b (top) are both IMAGE, both required. blend_mode is the nine-way combo above. opacity is 0–100 in 0.1 steps, default 100. One output, image, which goes wherever the original would have: Save Image, a video combine, or into LUT Master from this same pack for grading after you've composited.
The three jobs it's genuinely good at
Glow. Blur a copy of the image (any blur node, generous radius), then screen it back at 15–30% opacity. That's the entire bloom recipe - a bright pass isn't even required for a soft halation look.
Grain and texture. Generate noise, or loop a grain plate with an Image Loader, and blend it soft_light at 10–20%. The post-processing argument for why you'd want this at all is that AI output has no noise in it and real capture does; it's the cheapest thing that makes a frame read as photographed.
Partial grade. The pairing with the rest of the pack: run your image through LUT Master, then blend the graded result over the original at 30–60%. Usually easier to tune than a LUT slot's own strength.
normal at 100% is also a clean A/B switch - two branches in, flip the mode to pick one. No logic nodes required.
Install
Same pack as LUT Master, so you install it once:
cd ComfyUI/custom_nodes
git clone https://github.com/Rimor-dev/ComfyUI-LUT-Master.git
cd ComfyUI-LUT-Master
pip install -r requirements.txt
Restart ComfyUI. In ComfyUI Manager, search "LUT Master". No model files, no downloads for this node specifically.
Troubleshooting
Neither node shows up after install, and the console mentions comfy_api. Layer Blend is written against ComfyUI's newer V3 node API - from comfy_api.latest import io, io.ComfyNode, io.Schema - not the classic NODE_CLASS_MAPPINGS dictionary. That's the modern authoring style and it's fine, but an old ComfyUI will fail to import the file, and because the pack's __init__.py imports both modules eagerly, that failure takes LUT Master down with it. Update ComfyUI.
Both nodes disappear and the console mentions pillow_lut. Same eager-import story: the LUT module needs that dependency even if you only wanted Layer Blend. Install it into the environment ComfyUI runs (python_embeded\python.exe -m pip install -r requirements.txt on a portable Windows build).
Output is a single frame when you fed it a batch. One input was shorter. Check batch sizes upstream - the node takes the minimum rather than erroring.
The blend looks wrong in a way you can't name. Check which wire is where. image_a and image_b are the two easiest sockets in ComfyUI to plug in backwards, and multiply-with-the-layers-swapped looks nothing like multiply.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image_a | IMAGE | — | |
| image_b | IMAGE | — | |
| blend_mode | COMBO | normal | 9 options: normal, multiply, screen, overlay, soft_light, hard_light, +3 |
| opacity | FLOAT | 100.00–100 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |