Nodes/DJZ-Nodes/Video Temperature V1
ComfyUI Node

Video Temperature V1

Color grade by Kelvin, not by guesswork

By MushroomFleet·Created 2 years ago·Updated 5 months ago· 80
Video Temperature V1
  • images
  • IMAGE
temp_preset
custom_r1.0
custom_g1.0
custom_b1.0
intensity1.00

Color temperature is the single most convincing "this was shot on a camera" trick you can pull on AI video. Warm tungsten light pushes the whites orange; cool daylight pushes them blue. Video Temperature V1 is DJZ-Nodes' one-node answer: you feed it frames, pick a light source, and it multiplies the RGB channels to match. Simple enough to be a no-brainer in any finishing chain, and it's the kind of node that sounds trivial until you realize core ComfyUI has no built-in way to do it in one step.

How it works

Under the hood it's per-frame RGB channel multipliers - nothing fancy, which is the point. What elevates it past a static tint is that the presets are time-animated. The multipliers are actually small sine functions of the frame position, so the warmth drifts subtly across the clip instead of sitting rock-solid. That drift is what makes the grade feel alive; a frozen, perfectly-consistent tint is the tell of a filter.

The intensity dial (0–1) is a blend amount: it scales how far the multipliers deviate from neutral (1.0), so at 0.5 you get half-strength tungsten. Crank it to 1 for full effect. Output is the processed IMAGE batch.

The inputs that matter

  • temp_preset - the star. Options are none (neutral), tungsten (warm/orange - the classic indoor incandescent look), daylight (cool/blue), aging_print (a warm, slightly faded archival look that wobbles across the clip), and custom.
  • custom_r, custom_g, custom_b - only used when preset is custom. These are math strings, not plain numbers, and they accept t as the frame variable. "1.0" is a static multiplier; "1.1 + 0.05 * sin(t * 0.1)" gives you a breathing warmth. If an expression fails to parse, the node falls back to 1.0 (neutral) for that channel rather than erroring - which can silently kill your custom grade, so keep expressions simple.
  • intensity (0–1) - global strength of whatever preset you chose.

There's no mask input - it's a whole-frame grade. If you only want warmth in highlights or shadows, this node isn't the tool; run it through a mask-blend chain if you're desperate.

Installing it

Part of the DJZ-Nodes pack, so pack-level install:

cd ComfyUI/custom_nodes
git clone https://github.com/MushroomFleet/DJZ-Nodes
cd DJZ-Nodes
pip install -r requirements.txt

Restart ComfyUI. Or use ComfyUI Manager and search "DJZ-Nodes". You're installing a big pack for one small node, but the first pip install pulls the same requirements regardless - get used to it, there are a hundred more nodes in there you'll find uses for.

Troubleshooting

  • Custom preset does nothing. Check that temp_preset is actually set to custom - the R/G/B fields are ignored otherwise. Then check your expression: anything eval can't handle silently becomes 1.0.
  • The grade flickers. That's the animated sine in the presets doing its job, most visible in aging_print. If it reads as flicker rather than organic drift, back intensity down - the multipliers oscillate harder at full strength.
  • Everything is way too orange/blue. intensity defaults to 1.0. For a subtle correction, 0.3–0.5 is the zone most people actually want; treat 1.0 as "obviously graded."

Is it overhyped? No - it's a utility, and utilities don't need hype. It does one job (putting believable light temperature on your frames) and does it well. If you do any film-look finishing on video, this earns its spot next to the vignette and grain nodes permanently.

Categorypostprocessing/video

Inputs (6)

NameTypeDefaultDescription
imagesIMAGE
temp_presetCOMBO5 options: none, tungsten, daylight, aging_print, custom
custom_rSTRING1.0
custom_gSTRING1.0
custom_bSTRING1.0
intensityFLOAT1.000–1

Outputs (1)

NameTypeDescription
IMAGEIMAGE