ComfyUI Node

Bloom

Bloom that respects your highlights instead of washing them out

By criskb·Created 7 months ago·Updated 5 months ago· 0
Bloom
  • image
  • mask
  • image
  • mask
  • bloom_info
settings_json{"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}

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_strength before 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_json string 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.

CategoryMKRShift Nodes/VFX/Photo

Inputs (3)

NameTypeDefaultDescription
imageIMAGE
settings_jsonSTRING{"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}
maskoptMASK

Outputs (3)

NameTypeDescription
imageIMAGE
maskMASK
bloom_infoSTRING