Nodes/comfyui-superside-nodes/Superside Color Grading
ComfyUI Node

Superside Color Grading

Brightness, contrast, saturation and per-channel offsets — without touching a model

By Superside·Created about a month ago·Updated 3 days ago· 1
Superside Color Grading
  • image
  • image
brightness1.00
contrast1.00
saturation1.00
R0
G0
B0

This is the anti-hype node: no API key, no model call, no credits, nothing leaves your machine. It's four color primitives in one box - brightness, contrast, saturation, and additive per-channel R/G/B offsets - applied to an image in milliseconds. The whole point of it, and of the post-processing layer it belongs to, is that a lot of what people burn a diffusion pass on is really a lookup table's job. If your image is slightly too warm or a bit flat, that is not a reason to re-roll a generation. It's a reason to run this.

How it works is worth a sentence because the semantics matter. Brightness, contrast, and saturation are multiplicative factors, so 1.0 means no change, below 1 is less, above 1 is more - saturation at 0 goes full grayscale, at 3 it's aggressively punchy. The R, G, and B inputs are the odd ones out: each is an additive offset added to every pixel of that channel, clamped 0–255, ranging −255 to +255. That's a different operation from the multiplicative ones, and it's the difference between "the image is darker" and "the image has a red cast." Bump R up a bit and the whole frame shifts warm; pull B down and it shifts yellow. The additive-per-channel design is deliberate - it's the same shape of control you'd use to neutralize a color cast before a proper color match elsewhere in the graph.

Inputs: image (required), then brightness, contrast, saturation (each 0–3, default 1, step 0.01), and R/G/B (each −255 to 255, default 0). Output is a single image. Under the hood it's PIL ImageEnhance for the three factors and a clamped add for the channels, and it iterates over a batch frame by frame - so a batch of images gets the same grade applied to every frame. Alpha is preserved, which the pack explicitly notes, so RGBA stays RGBA and you don't lose transparency through the pass.

Where it fits in a real workflow: as the final finish after a generative edit, to fix exposure drift without re-running the generator; or as the cheap alternative to reaching for img2img when all you actually need is a gamma-ish fix. The one thing it can't do is match one image's colors to another - that's the pack's Color Match node (a Reinhard stats transfer), and it's a genuinely different tool. If you want to pull a drifted edit back toward the original's palette, reach for that one; this node is for taste.

No install friction beyond the pack itself: ComfyUI Manager (search "comfyui-superside-nodes") or

cd ComfyUI/custom_nodes
git clone https://github.com/Superside/comfyui-superside-nodes
pip install -r requirements.txt

Restart ComfyUI and it's under Superside. No key, no weights, no new dependencies beyond what the pack already pulls in. It's deterministic - run it a hundred times, same numbers, same output. That's the point.

CategorySuperside

Inputs (7)

NameTypeDefaultDescription
imageIMAGE
brightnessFLOAT1.000–3Brightness factor. 1.0 = no change, <1 darker, >1 brighter.
contrastFLOAT1.000–3Contrast factor. 1.0 = no change.
saturationFLOAT1.000–3Saturation factor. 1.0 = no change, 0 = grayscale.
RINT0-255–255Red channel offset added to every pixel (clamped 0-255).
GINT0-255–255Green channel offset added to every pixel (clamped 0-255).
BINT0-255–255Blue channel offset added to every pixel (clamped 0-255).

Outputs (1)

NameTypeDescription
imageIMAGE