Nodes/ComfyUI-JakeUpgrade/Color Grading JK๐Ÿ‰
ComfyUI Node

Color Grading JK๐Ÿ‰

Brightness, contrast, saturation and RGB offsets in one pass

By jakechaiยทCreated 2 years agoยทUpdated 3 months agoยท 146
Color Grading JK๐Ÿ‰
  • image
  • IMAGE
โ—„brightness1.00โ–บ
โ—„contrast1.00โ–บ
โ—„saturation1.00โ–บ
โ—„R0โ–บ
โ—„G0โ–บ
โ—„B0โ–บ

A generation that's technically fine but slightly off - too dark, washed out, green-tinted - is the most common reason an image misses. Color Grading JK is a quick global pass to fix exactly that: brightness, contrast, saturation, plus per-channel RGB offsets. It's not a LUT, it's not film emulation; it's the four knobs that fix 90% of "why does this look wrong" complaints.

How it works

The node runs PIL's ImageEnhance for the first three controls, then does a per-channel offset for the RGB ones.

  • brightness - a multiplier, default 1.0, range 0โ€“3. 1.0 is neutral.
  • contrast - a multiplier, default 1.0, range 0โ€“3.
  • saturation - a multiplier, default 1.0, range 0โ€“3.
  • R, G, B - additive offsets, default 0, range โˆ’255 to 255.

Note the two different semantics living on one node: brightness/contrast/saturation are factors (1.0 = do nothing), while R/G/B are offsets (0 = do nothing). Mixing them up is the classic first mistake - setting saturation to 0 doesn't make it neutral, it makes the image fully grayscale.

The channel offsets are useful for cast correction. A blue-ish render gets B nudged negative; a green cast from certain lighting gets G pulled down. Because they're simple additive shifts, they're blunt instruments - fine for neutralizing a cast, wrong for creative color grading. The node preserves the alpha channel if your input is RGBA, so you can grade layered images without losing transparency.

Inputs and outputs

  • image - the input IMAGE.
  • brightness, contrast, saturation - the three factor knobs.
  • R, G, B - the three channel offsets.
  • IMAGE - the graded result.

Batch-wise it processes every image in the input tensor with the same settings, which is exactly what you want when color-matching a sequence or a batch of variant renders.

Installing it

Ships in ComfyUI-JakeUpgrade:

  • ComfyUI Manager โ†’ search "JakeUpgrade" โ†’ install โ†’ restart.
  • Or:
cd ComfyUI/custom_nodes
git clone https://github.com/jakechai/ComfyUI-JakeUpgrade
cd ComfyUI-JakeUpgrade
pip install -r requirements.txt

Windows portable: run install.bat or ../../../python_embeded/python.exe -s -m pip install -r requirements.txt.

Common issues

  • Saturation 0 isn't neutral. It's grayscale. Neutral is 1.0. Same for brightness and contrast - the defaults are all 1.0, and any value you type replaces them, not adds to them.
  • R/G/B go negative fine. Offsets range โˆ’255 to 255; a negative value subtracts from that channel. You're not limited to boosting.
  • It's a global pass, not a masked one. No region control here. For selective grading you'd composite this with a mask or reach for a heavier color node.
  • Cast correction overshoot. Additive offsets can clip channels at 0 or 255, blowing out highlights. Small nudges (10โ€“30) beat big ones.

This is the "one more node before the save" that makes a render look finished instead of raw. It's also the node JakeUpgrade uses internally in its long-video workflows to keep color consistent across segments - a sign it's reliable enough to trust on a sequence, not just a single frame.

Category๐Ÿ‰ JK/๐Ÿ›ฉ๏ธ Image

Inputs (7)

NameTypeDefaultDescription
imageIMAGEโ€”
brightnessFLOAT1.000โ€“3โ€”
contrastFLOAT1.000โ€“3โ€”
saturationFLOAT1.000โ€“3โ€”
RINT0-255โ€“255โ€”
GINT0-255โ€“255โ€”
BINT0-255โ€“255โ€”

Outputs (1)

NameTypeDescription
IMAGEIMAGEโ€”