Nodes/Praveen's ComfyUI Tools/Image Brightness/Contrast/Saturation/RGB
ComfyUI Node

Image Brightness/Contrast/Saturation/RGB

A color-grading node with per-channel RGB gain most packs skip

By Praveenhalder·Created about a year ago·Updated 6 months ago· 2
Image Brightness/Contrast/Saturation/RGB
  • image
  • IMAGE
brightness1.00
contrast1.00
saturation1.00
red_gain1.00
green_gain1.00
blue_gain1.00

Image Brightness/Contrast/Saturation/RGB is the pack's one real image-adjustment node, and its name is a full spec: brightness, contrast, saturation, and per-channel red/green/blue gain, all on one node. Most utility packs stop at brightness and contrast; the RGB gains are what make this one worth a look if you do any color grading before or after generation.

You'd use it for the mundane but important stuff: fixing a render that came out too dark, warming up a cool-skewed image by nudging red and blue gain independently, or pushing saturation on a preview before you commit to a full run. Because it works in pixel space on the decoded IMAGE, it slots in anywhere - after the VAE decode, before the SaveImage, or as a preprocessing step feeding an img2img pass.

Inputs

All FLOAT, all 0–2.0 with 1.0 as neutral:

  • brightness - overall lighten/darken.
  • contrast - stretch or compress tonal range.
  • saturation - color intensity (0 = grayscale).
  • red_gain, green_gain, blue_gain - independent channel multipliers. This is the differentiator: push red_gain to 1.1 and blue_gain to 0.9 and you've got a warm tint without touching a curve node.

Output is the adjusted IMAGE.

How it works

Under the hood it converts each frame to a PIL image and applies ImageEnhance.Brightness, Contrast, and Color in that order, then multiplies the RGB channels by the gains and clips back to 0–1. Order matters if you're being deliberate: gains apply after the enhance steps, so the per-channel multipliers act on the already-adjusted pixels.

Where it's weak

It loops over the batch in Python and does the work on the CPU via PIL/NumPy, so it's not a GPU tensor op. For a single image it's instant. For a 64-frame batch at high resolution, it's noticeably slower than a batched tensor implementation - keep that in mind if you're grading video frames. It's also easy to blow out channels: at gains near 2.0 you're clipping, so the node compensates by clamping rather than rolling off. That's on you to dial back.

Installation

Part of Praveen's ComfyUI Tools. Install via ComfyUI Manager (search "Praveen" / "praveen-tools"), or:

cd ComfyUI/custom_nodes
git clone https://github.com/Praveenhalder/praveen-tools

Restart ComfyUI. No extra dependencies and no model downloads - Pillow, NumPy, and PyTorch are all stock ComfyUI. For per-image color tweaks, this is a perfectly good node; the RGB gain sliders are the reason to prefer it over a generic brightness node.

Categoryimage/postprocessing

Inputs (7)

NameTypeDefaultDescription
imageIMAGE
brightnessFLOAT1.000–2
contrastFLOAT1.000–2
saturationFLOAT1.000–2
red_gainFLOAT1.000–2
green_gainFLOAT1.000–2
blue_gainFLOAT1.000–2

Outputs (1)

NameTypeDescription
IMAGEIMAGE