🎨 PS Curves
The popup curve editor that makes this pack worth installing
- image
- mask
- image
- curve_chart
This is the heart of the ComfyUI-Curve pack, and the reason it exists. Photoshop-style curve adjustment with per-channel control, live histogram backgrounds, and - the standout bit - a double-click popup editor where you drag control points on a curve and watch the image change in real time, no re-running the workflow. If you've ever fiddled with an S-curve in a photo editor, you already know what this does; the novelty is doing it inside ComfyUI with the same fluidity.
Reach for it whenever you want tonal control, not just saturation sliders. Curves are the precise instrument: an S-curve adds contrast without touching color balance, a lifted bottom corner rescues crushed shadows, and per-channel curves are how you build a teal-and-orange grade or fix a color cast. It slots anywhere after an image exists - Load Image → this node → Preview/Save.
How it works
The node takes a list of control points per channel, interpolates them into a 256-entry lookup table, and remaps the image through it. Interpolation is cubic (smooth, Photoshop-like) or linear (straight lines between points, good for deliberate hard looks), and the strength slider (0-200%) blends the result back toward the original so you can apply a curve at 60% instead of committing to all of it.
The popup is where it shines. Double-click the node: click the curve to add a point, drag to move it, right-click to delete, toggle between RGB / R / G / B, and each channel's histogram renders behind its curve so you can aim adjustments at actual data. Hit Apply and the coordinates sync back into the node's string inputs. The second output, curve_chart, is a matplotlib-rendered image of the curves plus histograms - handy for documenting a look or eyeballing it side by side with the result.
The inputs that matter
rgb_curve,red_curve,green_curve,blue_curve- point lists as strings, format[[x1,y1],[x2,y2],...], default[[0,0],[255,255]](no adjustment). Points run 0-255.curve_type- cubic or linear.strength- 0 = no effect, 100 = full curve, 200 = doubled. Dial it down to keep a grade subtle.
Outputs: image (graded) and curve_chart (the visualization).
There's also an optional mask / mask_blur / invert_mask set for masking, plus two preset inputs - preset_curve_points and preset_suggested_channel - that pair with the pack's Curve Presets node. Wire CurvePresetNode into those and the preset's suggested channel (Red/Green/Blue/RGB) is applied automatically. Worth wiring up just to see the smart channel mapping do its thing.
Installing it
ComfyUI Manager → search "ComfyUI-Curve", or:
cd ComfyUI/custom_nodes
git clone https://github.com/aiaiaikkk/ComfyUI-Curve.git
Restart ComfyUI. No models to download; it's all tensor math. The pack pulls in scipy (curve interpolation) and matplotlib (the chart output), both light.
Where people get burned
The silent identity fallback is the sneaky one: if a curve string fails to parse, the code quietly defaults to the linear [[0,0],[255,255]] curve - no error, just no effect. Check your formatting if a curve "does nothing"; batch input via the popup's numeric entry (0,0;64,80;128,128;192,200;255,255) avoids hand-typing JSON. Also remember strength starts at 100, and if curve_chart errors out, matplotlib isn't installed in your environment - pip install matplotlib in ComfyUI's Python fixes it.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| rgb_curve | STRING | [[0,0],[255,255]] | RGB曲线控制点,格式:[[x1,y1],[x2,y2],...] |
| red_curve | STRING | [[0,0],[255,255]] | 红色通道曲线控制点 |
| green_curve | STRING | [[0,0],[255,255]] | 绿色通道曲线控制点 |
| blue_curve | STRING | [[0,0],[255,255]] | 蓝色通道曲线控制点 |
| curve_type | COMBO | cubic | 曲线插值类型 |
| strength | FLOAT | 1000–200 | 调整效果强度,100为完整效果,0为无效果 |
| preset_curve_pointsopt | STRING | 来自CurvePresetNode的预设曲线点,格式:x1,y1;x2,y2;... | |
| preset_suggested_channelopt | STRING | 来自CurvePresetNode的建议通道:RGB/Red/Green/Blue | |
| maskopt | MASK | 可选遮罩,调整仅对遮罩区域有效 | |
| mask_bluropt | FLOAT | 0.00–50 | 遮罩边缘羽化程度 |
| invert_maskopt | BOOLEAN | false | 反转遮罩区域 |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| curve_chart | IMAGE | — |