Video Temperature V1
Color grade by Kelvin, not by guesswork
- images
- IMAGE
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 arenone(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), andcustom.custom_r,custom_g,custom_b- only used when preset iscustom. These are math strings, not plain numbers, and they accepttas 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_presetis actually set tocustom- the R/G/B fields are ignored otherwise. Then check your expression: anythingevalcan'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, backintensitydown - the multipliers oscillate harder at full strength. - Everything is way too orange/blue.
intensitydefaults 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.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| temp_preset | COMBO | 5 options: none, tungsten, daylight, aging_print, custom | |
| custom_r | STRING | 1.0 | — |
| custom_g | STRING | 1.0 | — |
| custom_b | STRING | 1.0 | — |
| intensity | FLOAT | 1.000–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |