Bloom
Bloom that respects your highlights instead of washing them out
- image
- mask
- image
- mask
- bloom_info
Bloom is one of those post-processing moves where the "AI look" dies: a real glowing light source reads as captured, while a raw diffusion render reads as flat pixels. x1Bloom gives you the classic version - threshold the brights, blur them, add them back - with the controls to keep it from becoming a hazy mess. It's from MKRShift Nodes' VFX/Photo branch, sitting alongside bokeh, chromatic shift, and sharpen.
The whole pack is young (no impressions yet, nothing on Reddit when I looked), so treat it as promising fresh code rather than the packed-down veteran you'll find in WAS Node Suite. What it does do, it does with clean deterministic math.
How it works
The recipe is textbook, straight from the source: compute a bright pass from bloom_threshold with a soft rolloff (bloom_softness), blur it with a Gaussian, and add it back to the frame scaled by bloom_strength. The refinement is that it uses two blurs - a tighter one at bloom_radius and a wider one, blended ~80/20, which is what makes the glow fall off naturally instead of looking like a single crisp-edged smear. bloom_warmth tints the bloom warm or cool (negative pulls it blue), which is how you get that "light bulb lit the room" feel rather than a gray halo.
Outputs: image (the finished frame), mask (the matte of where bloom actually landed), and bloom_info (a string with the resolved settings and mask coverage). The optional mask input limits the effect to a region, feathered by mask_feather.
The inputs that matter
bloom_strength- defaults to 0.0, so the node is a no-op until you raise it. That's deliberate, but it does mean "nothing happened" is the first thing you'll see.bloom_threshold- what counts as a highlight. Too low and you're blooming the whole frame; 0.7-ish keeps it to the brights.bloom_radius- how far the glow travels.bloom_warmth- the difference between "nice glow" and "white fog".
Everything is driven through a single settings_json string widget, but the node ships a frontend panel that turns it into sliders - you're not editing JSON by hand unless you want to.
Installing
ComfyUI Manager → search MKRShift Nodes, or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart ComfyUI. No requirements, no models - it runs on the numpy/PIL/torch you already have. (ffmpeg matters only for the pack's video export nodes, not this one.)
Where people get burned
- It's off by default. If your output is identical to your input, check
bloom_strengthbefore hunting for bugs. - The mask output is the bloom matte, not the mask you plugged in. Confusing the two is the most common miswire with these nodes.
- Corrupting the
settings_jsonstring silently resets everything to defaults - the parser catches bad JSON and moves on instead of telling you. - It's CPU-only per frame. One hero frame or a short clip: great. A thousand-frame render: budget accordingly.
The 0.0 default is honestly the right call - bloom is one of those things people slam to 11 and then wonder why their image looks like a fever dream. Start at 0.2, tick threshold, tune warmth.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| settings_json | STRING | {"bloom_strength":0.0,"bloom_radius":14.0,"bloom_threshold":0.7,"bloom_softness":0.4,"bloom_warmth":0.0,"mask_feather":12.0,"invert_mask":false} | — |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| bloom_info | STRING | — |