ComfyUI Node

Tone

The one node that covers 90% of 'make this photo look right'

By criskb·Created 7 months ago·Updated 5 months ago· 0
Tone
  • image
  • mask
  • image
  • mask
  • tone_info
settings_json{"exposure":0.0,"contrast":1.0,"saturation":1.0,"tone_warmth":0.0,"tone_fade":0.0,"mask_feather":12.0,"invert_mask":false}

Here's the thing about the "AI look" in a finished render: it's rarely the model's fault, it's that nobody graded the output. A flat, oversaturated, or cold image just needs a basic photo pass - exposure, contrast, saturation, a touch of warmth, maybe a little fade - and suddenly it reads as captured instead of generated. Tone is that pass in a single node. It's not flashy and it doesn't need to be; it's the node you put at the end of the graph, before save, to make the image stop looking like a raw latent. This is exactly the kind of deterministic finish the modidex KB's post-processing doc argues you should do with math, not another diffusion pass.

How it works

Five knobs, each doing what it says, in one settings_json box. exposure is an additive/tonal lift (stops, roughly); contrast is a curve around mid-gray; saturation scales color intensity in HSV; tone_warmth shifts the white balance toward warm or cool; tone_fade lifts the blacks and slightly desaturates shadows for that filmic "faded" look. The order matters - the fade applies to the tonally-adjusted result, so it interacts with contrast the way a real film stock would. Optional mask with mask_feather/invert_mask lets you grade only part of the image - skin-only warmth correction is the classic use.

The inputs and outputs are the pack-standard pattern: image in, settings_json for the controls, and image / mask / tone_info out.

The inputs that matter

  • exposure - start here if the image is too dark or blown (default 0)
  • contrast - the flatness fixer (1.0 = neutral)
  • tone_warmth - the cheap "make it look photographed" move; a slight positive reads as golden hour
  • tone_fade - the film-look knob, use sparingly (0 = none)

Installing it

Ships in MKRShift Nodes from criskb. ComfyUI Manager → "MKRShift Nodes", or:

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

Restart ComfyUI; it's under MKRShift Nodes → VFX → Photo. No models or extra deps - numpy/Pillow/torch.

Common gotchas

The pack has no community footprint yet, so trust the code. Standard MKRShift JSON traps: malformed settings_json silently reverts to defaults, out-of-range values clamp. Two grading-specific notes. First, tone_fade is the one knob people overdo - past about 0.3 it stops looking filmic and starts looking like a washed-out Instagram preset; the default is 0 for a reason. Second, exposure and contrast are not interchangeable: if the image is dark, add exposure first, then decide on contrast. And remember this is a final-pass node - put it after your upscale, not before, or you'll grade then resample and lose the subtlety.

CategoryMKRShift Nodes/VFX/Photo

Inputs (3)

NameTypeDefaultDescription
imageIMAGE
settings_jsonSTRING{"exposure":0.0,"contrast":1.0,"saturation":1.0,"tone_warmth":0.0,"tone_fade":0.0,"mask_feather":12.0,"invert_mask":false}
maskoptMASK

Outputs (3)

NameTypeDescription
imageIMAGE
maskMASK
tone_infoSTRING