Nodes/ComfyUI-Curve/🎨 Color Grading
ComfyUI Node

🎨 Color Grading

Lightroom-style color wheels, minus the subscription

By aiaiaikkk·Created about a year ago·Updated 10 months ago· 181
🎨 Color Grading
  • image
  • mask
  • image
shadows_hue0
shadows_saturation0
shadows_luminance0
midtones_hue0
midtones_saturation0
midtones_luminance0
highlights_hue0
highlights_saturation0
highlights_luminance0
blend50
balance0
blend_modenormal
overall_strength1.0
mask_blur0.0
invert_maskfalse

You don't need Lightroom to get the Lightroom look. This is the flagship node of the ComfyUI-Curve pack: three color wheels - shadows, midtones, highlights - that let you grade a generated image the way a colorist grades a still, with zero Adobe software and zero API calls. It's pure tensor math running locally, and once you've used it, the stock ComfyUI color nodes feel like training wheels.

Reach for it at the very end of a workflow, after the KSampler and VAE decode and before Save. AI images come out of the decode with baked-in color you mostly don't control; this is where you push the shadows blue, warm up the highlights, and stop the whole image from looking like it was graded with a blunt instrument. It's also the most popular node in the pack by search impressions, and for good reason - it's the one you'll actually open again and again.

How it works

The node splits the image into three tonal regions and lets you shift hue, saturation, and luminance independently in each. The region separation uses luminance masks built with sigmoid functions for smooth, Lightroom-ish transitions, and the color math runs in Lab space so a full desaturation lands on clean grayscale instead of a cyan tint (a bug the author fixed along the way, per the changelog). You pick how the graded result lands on the original via blend_mode - normal, multiply, screen, overlay, soft_light, hard_light, color_dodge, or color_burn.

The fun part is the interface. Double-click the node and a popup opens with the three wheels and a live preview. Drag on a wheel to set hue and positive saturation; hold Shift and drag for negative saturation (desaturation). Spacebar holds down to compare against the original. When you hit Apply, the values sync back to the node's inputs - you never re-run the workflow to see what you're doing.

The inputs that actually matter

Nine sliders do the heavy lifting, and honestly you'll set most of them:

  • shadows_hue/saturation/luminance, midtones_*, highlights_* - the three regions, each with hue (-180 to 180) and saturation/luminance (-100 to 100).
  • blend - how strongly the grade applies, default 50 (the author matches Lightroom's default). Dial this back when a look feels overcooked.
  • balance - slides the shadow/highlight split point; -100 leans shadows, +100 leans highlights. Subtle, but it's how you keep a grade from touching the sky when you only care about the ground.
  • overall_strength - 0 to 2, a master volume for the whole effect. Default 1.
  • blend_mode - soft_light is your friend for natural tweaks; overlay if you want drama.

There's also optional mask, mask_blur (0-20 feathering), and invert_mask so you can grade only part of the frame. Single output, image, wires straight into a Preview or Save node.

Installing it

The pack installs like any other. ComfyUI Manager → search "ComfyUI-Curve", or:

cd ComfyUI/custom_nodes
git clone https://github.com/aiaiaikkk/ComfyUI-Curve.git

Then restart ComfyUI. No model downloads, no keys - the dependencies are numpy, scipy, and matplotlib (for the chart nodes), all lightweight next to a checkpoint. ComfyUI's bundled Python already has torch.

Where people get burned

Mostly by the defaults. Every slider starts at 0, so if you drop the node in and see no change, that's correct behavior - move something. Second, popup edits only stick when you click Apply; closing the window with Escape discards them. And a classic: go to -100 saturation on all three regions expecting black and white, and if it comes out slightly off-color, nudge blend to 100 first - the Lab-space desaturation is the accurate path, and the author explicitly fixed color casts there. Start gentle, blend low, and this node turns "nice render" into "looks intentional."

CategoryImage/Adjustments

Inputs (17)

NameTypeDefaultDescription
imageIMAGE
shadows_hueFLOAT0-180–180阴影区域色相偏移(-180到180度)
shadows_saturationFLOAT0-100–100阴影区域饱和度调整(-100到100%)
shadows_luminanceFLOAT0-100–100阴影区域明度调整(-100到100%)
midtones_hueFLOAT0-180–180中间调区域色相偏移(-180到180度)
midtones_saturationFLOAT0-100–100中间调区域饱和度调整(-100到100%)
midtones_luminanceFLOAT0-100–100中间调区域明度调整(-100到100%)
highlights_hueFLOAT0-180–180高光区域色相偏移(-180到180度)
highlights_saturationFLOAT0-100–100高光区域饱和度调整(-100到100%)
highlights_luminanceFLOAT0-100–100高光区域明度调整(-100到100%)
blendFLOAT500–100控制色彩分级效果的混合程度(0-100%,Lightroom默认50)
balanceFLOAT0-100–100控制阴影与高光之间的平衡点(-100=偏向阴影,0=中间,100=偏向高光)
blend_modeCOMBOnormal色彩分级的混合模式
overall_strengthFLOAT1.00–2色彩分级的整体强度
maskoptMASK可选遮罩,色彩分级仅对遮罩区域有效
mask_bluroptFLOAT0.00–20遮罩边缘羽化程度
invert_maskoptBOOLEANfalse反转遮罩区域

Outputs (1)

NameTypeDescription
imageIMAGE