Nodes/DJZ-Nodes/Video Film Damage
ComfyUI Node

Video Film Damage

Aging your video the honest way

By MushroomFleet·Created 2 years ago·Updated 5 months ago· 80
Video Film Damage
  • images
  • IMAGE
damage_presetmedium
scratch_density0.30
scratch_width_scale1.0
dust_amount0.20
dust_size_scale1.0
deterioration_strength0.25
time_variance0.50
custom_expressionsin(t * 0.1) * 0.5 + 0.5

Film damage is a genre of effect that's easy to get wrong: slapping a scratch texture on a clean clip reads as fake the second a viewer's eye lands on it. Video Film Damage does it the honest way - it builds the damage from the same ingredients real aged film has (vertical scratches, dust specks, deterioration) and, crucially, lets you control how the damage changes over time. The time dimension is what makes it convincing, and it's the reason this sits alongside the pack's VHS and datamosh nodes rather than in the filter bin.

How it works

The node layers three damage systems over each frame:

  • Scratches - vertical lines scaled by scratch_density (0–1) and thickened by scratch_width_scale (0.1–5). The thickness auto-scales with the longest image edge, so 4K footage doesn't get comically fat scratch lines.
  • Dust - speckles across the frame at dust_amount, sized by dust_size_scale.
  • Deterioration - deterioration_strength (0–1) fades the image, like faded and under-exposed stock.

Then time_variance (0–1) and, in custom mode, a custom_expression drive how all of it changes frame to frame. The expression gets t plus sin, cos, tan, exp, sqrt, and pi, and the default - sin(t * 0.1) * 0.5 + 0.5 - oscillates the damage on a slow wave. The presets (none/light/medium/heavy/severe) just set sane starting values for the sliders; custom hands the wheel to your expression.

Inputs and outputs

Required: images, damage_preset, scratch_density, scratch_width_scale, dust_amount, dust_size_scale, deterioration_strength, time_variance, custom_expression. Output: IMAGE, batch-safe.

The only input most people touch: damage_preset. Set it to light/medium/heavy and then nudge time_variance - that's 90% of the useful surface. The rest is for when you're chasing a specific look.

Where it sits in a workflow

Aging is a story-telling beat: a memory, a flashback, an "old home movie" scene. Run your clip through here before compositing and it inherits the grain-and-grime context that makes the rest of the scene read as period. It layers well with the pack's film-grain and Technicolor nodes - the classic combo is a faded grade + damage + grain.

Install

Part of DJZ-Nodes by Drift Johnson. ComfyUI Manager → "DJZ-Nodes", or:

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

Restart ComfyUI. numpy/torch/cv2 - already in ComfyUI.

Gotchas

At time_variance 0, the damage is effectively static per frame (still randomized per call), which on video reads as a texture overlay, not damage - turn it up for the real effect. Randomness here is unseeded, so runs aren't reproducible; if you're rendering a sequence and the scratches must match across takes, this node isn't the tool for that. And custom_expression errors silently fall back to a 0.5 value, so a typo won't error loudly - it'll just produce boring damage.

Categoryimage/effects

Inputs (9)

NameTypeDefaultDescription
imagesIMAGE
damage_presetCOMBOmedium6 options: none, light, medium, heavy, severe, custom
scratch_densityFLOAT0.300–1
scratch_width_scaleFLOAT1.00.1–5
dust_amountFLOAT0.200–1
dust_size_scaleFLOAT1.00.1–5
deterioration_strengthFLOAT0.250–1
time_varianceFLOAT0.500–1
custom_expressionSTRINGsin(t * 0.1) * 0.5 + 0.5

Outputs (1)

NameTypeDescription
IMAGEIMAGE