RGB Curve Editor
Draw curves for red, green and blue — and get three float arrays out
- rgb_curve_points
- red
- green
- blue
This is the flagship node of ComfyUI_Curves, and the closest thing the pack has to a Photoshop curves panel. Instead of typing numbers, you get a little canvas widget: click to drop points, drag them around, and the node turns your drawing into three float arrays - one per color channel - that you can wire anywhere a custom curve is accepted.
The pitch, straight from the author: it's a multipurpose utility for making and passing FLOAT arrays inside ComfyUI - "editable mathematic functions to create filters for audio, color channels or anything that accepts custom curves for automation." It doesn't do anything by itself; it's a shape-maker. What you do with those shapes is up to you.
How it works
The magic lives in the frontend, in the pack's web/rgb_curves.js. The node's only input, rgb_curve_points, is a custom canvas widget with three independent curves (red, green, blue). You pick a channel with the R/G/B buttons, then:
- Click in the plot area to add a control point.
- Drag a point to move it.
- Double-click a point to delete it.
- Use the top buttons Reset Linear, Delete Point, and Square Wave for shortcuts.
Each curve is a list of points interpolated into a 256-value array - linear interpolation between control points, with the endpoints pinned to x=0 and x=1 (you can slide them up and down, but not sideways). Everything is clamped to the 0–1 range, so you can't accidentally draw a curve that outputs garbage out of bounds.
The Python side is deliberately boring: it just converts the widget's three arrays to tensors and hands them out. The clever part is that your drawing is serialized into the workflow JSON itself, so when you save a workflow, the curves you drew come back with it. That's genuinely nice - your curve is part of the workflow file, no extra files to lose.
Inputs and outputs that matter
rgb_curve_points- the drawing widget. This is the whole node; it's where you make the curve.red,green,blue(FLOAT) - the three 256-element arrays, one per channel.
Despite the schema saying FLOAT, the code returns tensors of 256 floats each. That's the "FLOAT array" thing the pack is named for. Most consumers in the wider ecosystem that accept a FLOAT input will take the array as-is. If you're ever unsure what your curve actually looks like, wire one of these outputs into the pack's own Curve Debugger node and look at the graph.
Installing it
It ships with the ComfyUI_Curves pack. Through ComfyUI Manager, search ComfyUI_Curves, install, restart. Or clone manually:
cd ComfyUI/custom_nodes
git clone https://github.com/tavyra/ComfyUI_Curves
Then restart ComfyUI. No requirements.txt, no model downloads - it only needs torch and numpy, which ComfyUI already bundles. No heavy deps to babysit.
Gotchas
- Endpoints are pinned horizontally. You can't move a first or last point left or right, only vertically. If your curve needs to start off the edge, that's not how this works.
- Everything clamps to 0–1. Values outside that range get cut off in the interpolation, so don't plan on drawing curves that exceed the range.
- The widget is small. On a busy workflow the canvas is easy to fat-finger; zooming the graph isn't a thing here. If a point lands wrong, double-click to remove it.
- Nothing connects out of it by itself. It produces three arrays - what eats them is up to you. Audio filters, per-channel color grading, automation ramps: it's a generic shape-maker, and that's exactly the point.
If you want the same hand-editing but with procedurally generated sine/saw/triangle waves as a starting point instead of a blank canvas, grab the pack's RGBCurvesAdvanced node instead.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| rgb_curve_points | rgb_curve_editor_widget | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| red | FLOAT | — |
| green | FLOAT | — |
| blue | FLOAT | — |