ComfyUI Node

Split Tone

Split Tone does it in two color pickers

By criskb·Created 7 months ago·Updated 5 months ago· 0
Split Tone
  • image
  • mask
  • image
  • mask
  • split_tone_info
settings_json{"shadow_hue":210.0,"shadow_sat":0.3,"highlight_hue":36.0,"highlight_sat":0.32,"balance":0.0,"pivot":0.5,"mix":0.75,"mask_feather":12.0,"invert_mask":false}

You know the look: cool blue shadows, warm golden highlights. Blockbuster cinema, every third AI image on the front page. The usual way to get it is to hunt for a LUT that does approximately that and hope the skin doesn't turn green. x1SplitTone is the version where you just say the words: pick a shadow hue, pick a highlight hue, and the node bends the image's luminance toward each. Two pickers, no LUT file, no guesswork.

How it works

Split toning works on luminance, not hue keys. The image is split into a shadow region and a highlight region around a pivot point (0.50, i.e. mid-gray), and each region is tinted toward its chosen hue - shadow_hue/shadow_sat for the darks, highlight_hue/highlight_sat for the lights. The balance knob (default 0, range -1 to +1) shifts the split itself: drag it negative and more of the image counts as shadow, so the highlight tint gets squeezed into just the brightest peaks; positive does the opposite. That one slider is what separates a subtle grade from a full-color-cast image, and it's the first thing you should touch after setting the two hues.

The classic defaults in the node are already the famous pairing: shadow hue 210° (blue/teal), highlight hue 36° (warm orange), both at modest saturation. mix (0.75) blends the effect back against the original, which is how you keep a portrait from looking like a sunset filter - pull it down until the skin still reads as skin.

The inputs that matter

Everything is in a settings_json string, prefilled when the node drops:

  • shadow_hue (210) / shadow_sat (0.30) - the cool end.
  • highlight_hue (36) / highlight_sat (0.32) - the warm end.
  • balance (0) - where the split sits. The power knob.
  • pivot (0.50) - the luminance point that counts as the border.
  • mix (0.75) - overall blend. Start here when it's too much.

Optional mask input restricts the grade to a region (skin gets its own pass, which is the professional move). Outputs are image, mask (the region actually graded), and split_tone_info (a text line logging the four color values - handy if you want to lock in a look across frames).

Installing it

Part of the MKRShift Nodes pack. ComfyUI Manager: search "MKRShift", install, restart. Or:

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

Restart after. No models, no LUT files to source - this is pure HSV math on the frame.

Gotchas

Two things will annoy you if you don't watch for them. First, split toning tints everything in the region, including skin - that's why the pack pairs this with x1SkinToneCheck/x1SkinToneProtect. Do the cinematic split, then protect the face. Second, the settings_json trap is real here: invalid JSON silently falls back to defaults, so a "why did my look vanish" is usually a broken brace, not a broken node. And a tip: for a subtler film look, run this before your grain pass - the grain then sits on top of the tone, which reads far more "shot on film" than grain on flat color.

CategoryMKRShift Nodes/VFX/Concept

Inputs (3)

NameTypeDefaultDescription
imageIMAGE
settings_jsonSTRING{"shadow_hue":210.0,"shadow_sat":0.3,"highlight_hue":36.0,"highlight_sat":0.32,"balance":0.0,"pivot":0.5,"mix":0.75,"mask_feather":12.0,"invert_mask":false}
maskoptMASK

Outputs (3)

NameTypeDescription
imageIMAGE
maskMASK
split_tone_infoSTRING