🎨 PS HSL
Twenty-four color sliders that are actually manageable
- image
- mask
- IMAGE
HSL adjustment is the fine brush of color grading: instead of moving whole-image saturation, you reach into one color family and adjust only it. This node gives you Photoshop/Camera Raw-style selective HSL across eight color bands - Red, Orange, Yellow, Green, Cyan, Blue, Purple, Magenta - each with its own Hue, Saturation, and Lightness slider. That's 24 sliders before you even touch the global controls. It sounds like a wall of knobs, and it is, until you remember you'll realistically touch two or three.
Reach for it for the classic moves that no global slider can do cleanly. Skin tone work: nudge Red and Orange saturation down a touch and skin goes from flushed to natural without desaturating the whole image. Sky work: pull Blue and Cyan lightness down to deepen a washed-out sky. Foliage: Green and Yellow hue shifts to push leaves from yellow-green toward a richer green. A sunset grade is basically Orange and Magenta. These are the micro-adjustments that separate "bright image" from "considered image."
How it works
The node separates the image into color families and adjusts each independently - the same banded HSL model Photoshop's selective adjustments use, implemented with OpenCV color math. Values run -100 to +100 per slider. There are also three global controls (hue, saturation, lightness) that move everything at once, and a colorize toggle that's worth a detour: flip it on and the sliders behave like a tint/duotone tool, letting you push the whole image toward a single hue - handy for quick moody looks or sepia-ish treatments.
The double-click popup editor is the reason the slider wall works. Open it, pick a color band, drag the sliders, and the preview updates live - "slide, watch skin tone, slide back." When it looks right, hit Apply and the values sync back to the node's inputs. You never guess blind.
The inputs that matter
The full set is red_hue/red_saturation/red_lightness through magenta_* for all eight bands, plus:
hue,saturation,lightness- global adjustments, -100 to +100. Reach for these last; the banded controls are the point.colorize- the tint/duotone toggle.
There's an optional mask / mask_blur (0-20) / invert_mask set so you can restrict the HSL work to part of the frame. One output, an IMAGE - note the pack doesn't give it a friendly return name, so it just shows up as "IMAGE" on the wire. Don't let that throw you; it's the processed image, wire it to Preview or Save.
Installing it
Standard ComfyUI-Curve install. ComfyUI Manager → search "ComfyUI-Curve", or:
cd ComfyUI/custom_nodes
git clone https://github.com/aiaiaikkk/ComfyUI-Curve.git
Restart ComfyUI. No models to fetch.
Where people get burned
Two traps. First, the per-band ranges are fixed and the bands don't overlap much - a "Red" adjustment catches reds but won't smoothly feather into orange, so edits can feel stepwise; that's the model, not a bug. Second, huge HSL swings push colors to band edges and can produce banding in smooth gradients (skies, bokeh), especially on 8-bit renders - if you see color stepping, dial the sliders back or grade at higher precision before saving. And remember the popup's Apply button; closing it without applying discards the session.
Inputs (32)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| red_hue | FLOAT | 0-100–100 | 红色 - 色相调整 (-100 ~ +100) |
| red_saturation | FLOAT | 0-100–100 | 红色 - 饱和度调整 (-100 ~ +100) |
| red_lightness | FLOAT | 0-100–100 | 红色 - 明度调整 (-100 ~ +100) |
| orange_hue | FLOAT | 0-100–100 | 橙色 - 色相调整 (-100 ~ +100) |
| orange_saturation | FLOAT | 0-100–100 | 橙色 - 饱和度调整 (-100 ~ +100) |
| orange_lightness | FLOAT | 0-100–100 | 橙色 - 明度调整 (-100 ~ +100) |
| yellow_hue | FLOAT | 0-100–100 | 黄色 - 色相调整 (-100 ~ +100) |
| yellow_saturation | FLOAT | 0-100–100 | 黄色 - 饱和度调整 (-100 ~ +100) |
| yellow_lightness | FLOAT | 0-100–100 | 黄色 - 明度调整 (-100 ~ +100) |
| green_hue | FLOAT | 0-100–100 | 绿色 - 色相调整 (-100 ~ +100) |
| green_saturation | FLOAT | 0-100–100 | 绿色 - 饱和度调整 (-100 ~ +100) |
| green_lightness | FLOAT | 0-100–100 | 绿色 - 明度调整 (-100 ~ +100) |
| cyan_hue | FLOAT | 0-100–100 | 浅绿 - 色相调整 (-100 ~ +100) |
| cyan_saturation | FLOAT | 0-100–100 | 浅绿 - 饱和度调整 (-100 ~ +100) |
| cyan_lightness | FLOAT | 0-100–100 | 浅绿 - 明度调整 (-100 ~ +100) |
| blue_hue | FLOAT | 0-100–100 | 蓝色 - 色相调整 (-100 ~ +100) |
| blue_saturation | FLOAT | 0-100–100 | 蓝色 - 饱和度调整 (-100 ~ +100) |
| blue_lightness | FLOAT | 0-100–100 | 蓝色 - 明度调整 (-100 ~ +100) |
| purple_hue | FLOAT | 0-100–100 | 紫色 - 色相调整 (-100 ~ +100) |
| purple_saturation | FLOAT | 0-100–100 | 紫色 - 饱和度调整 (-100 ~ +100) |
| purple_lightness | FLOAT | 0-100–100 | 紫色 - 明度调整 (-100 ~ +100) |
| magenta_hue | FLOAT | 0-100–100 | 品红 - 色相调整 (-100 ~ +100) |
| magenta_saturation | FLOAT | 0-100–100 | 品红 - 饱和度调整 (-100 ~ +100) |
| magenta_lightness | FLOAT | 0-100–100 | 品红 - 明度调整 (-100 ~ +100) |
| hue | FLOAT | 0-100–100 | 全局色相调整 (-100 ~ +100) |
| saturation | FLOAT | 0-100–100 | 全局饱和度调整 (-100 ~ +100) |
| lightness | FLOAT | 0-100–100 | 全局明度调整 (-100 ~ +100) |
| colorize | BOOLEAN | false | 启用彩色化模式 |
| maskopt | MASK | 可选遮罩,调整仅对遮罩区域有效 | |
| mask_bluropt | FLOAT | 0.00–20 | 遮罩边缘羽化程度 |
| invert_maskopt | BOOLEAN | false | 反转遮罩区域 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |