Tone
The one node that covers 90% of 'make this photo look right'
- image
- mask
- image
- mask
- tone_info
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 hourtone_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.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| settings_json | STRING | {"exposure":0.0,"contrast":1.0,"saturation":1.0,"tone_warmth":0.0,"tone_fade":0.0,"mask_feather":12.0,"invert_mask":false} | — |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| tone_info | STRING | — |