Nodes/MKRShift_Nodes/Color Wheels
ComfyUI Node

Color Wheels

Drag the puck, grade the shadows and highlights

By criskb·Created 7 months ago·Updated 5 months ago· 0
Color Wheels
  • image
  • mask
  • image
  • mask
  • color_wheels_info
settings_json{"lift_r":0.0,"lift_g":0.0,"lift_b":0.0,"gamma_r":1.0,"gamma_g":1.0,"gamma_b":1.0,"gain_r":1.0,"gain_g":1.0,"gain_b":1.0,"offset_r":0.0,"offset_g":0.0,"offset_b":0.0,"balance":0.0,"saturation":1.0,"mix":1.0,"mask_feather":12.0,"invert_mask":false}

This is the node that actually feels like sitting in a grading suite. x1ColorWheels gives you physical drag-in-the-node color wheels for shadows, midtones, highlights, and offset - the lift/gamma/gain layout every colorist knows - instead of a wall of numeric sliders. It's the flagship grading node in MKRShift Nodes' Color/Grade branch, and it's one of the few places in this pack where the custom frontend isn't sugar, it's the point.

The pack is young (no impressions, no community chatter I found), so the honest framing holds: fresh code, but the grade math underneath is the same deterministic stuff the rest of the branch runs on.

How it works

Four wheels, each mapping to the classic grade controls:

  • Shadows - lift_r/g/b, the black point tint
  • Midtones - gamma_r/g/b, the middle of the curve
  • Highlights - gain_r/g/b, the white point tint
  • Offset - offset_r/g/b, the additive shift that pushes everything (the "lift the whole image" control)

Drag inside a wheel and the white puck moves, updating the underlying RGB triplet - which also means everything is fully workflow-addressable as plain numbers in the JSON. balance skews the wheel response toward shadows or highlights, saturation is global, and mix is your safety valve to blend the grade back. The optional mask limits the grade to a region.

Outputs: image, mask (the grade matte), color_wheels_info (settings log). All the settings_json state round-trips through the standard MKRShift panel, so the graph stays deterministic and re-runnable.

Inputs that matter

  • The four wheels are the inputs - shadows/lift, midtones/gamma, highlights/gain
  • balance - tilts where the midtones response sits; nudge it when shadows feel heavy
  • mix - the single most useful knob; a 0.6 mix grade survives, a 1.0 mix grade often doesn't

Installing

ComfyUI Manager → search MKRShift Nodes, or:

cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes

Restart ComfyUI. No models, no new dependencies - this is numpy math under the wheels.

Where people get burned

  • Lift and offset look similar and aren't. Lift moves the black point (shadows change, highlights stay), offset pushes the whole image additively and clips brights fast. Reach for lift for "warm up the shadows," offset for "something is wrong everywhere."
  • Wheel position vs. the numeric widgets. The frontend and the JSON stay in sync via the settings_json widget, but if you break the JSON, the wheels reset to defaults silently. If the pucks stop matching what you set, check the string.
  • The mask output is the grade matte, not your input mask. Pack-wide convention, still the most common miswire.

If you only install one node from this pack's grading branch, it's this one. It's the difference between "adjusting RGB values" and "grading" - and it's the most tactile thing in the Color section.

CategoryMKRShift Nodes/Color/Grade

Inputs (3)

NameTypeDefaultDescription
imageIMAGE
settings_jsonSTRING{"lift_r":0.0,"lift_g":0.0,"lift_b":0.0,"gamma_r":1.0,"gamma_g":1.0,"gamma_b":1.0,"gain_r":1.0,"gain_g":1.0,"gain_b":1.0,"offset_r":0.0,"offset_g":0.0,"offset_b":0.0,"balance":0.0,"saturation":1.0,"mix":1.0,"mask_feather":12.0,"invert_mask":false}
maskoptMASK

Outputs (3)

NameTypeDescription
imageIMAGE
maskMASK
color_wheels_infoSTRING