LayerFilter: Film
Film
- image
- depth_map
- image
Film is the "make this look like it was shot on film, not rendered by a GPU" node, and it's one of the more genuinely useful filters in the pack. It bundles the whole analog-photography look into one box: grain, vignette, and an optional depth-based focus blur. AI renders tend to look too clean and too evenly sharp, and this is the node that roughs them up in the flattering way - the imperfections that read as "real camera."
There are a lot of knobs, but they cluster into three jobs. The grain group - grain_power (default 0.15), grain_scale, grain_sat, grain_shadows, grain_highs - controls how much film grain, how coarse, how colored, and how it's distributed between shadows and highlights. The vignette group - vignette_intensity (default 0.5) plus center_x / center_y to place the darkened corners - adds that lens falloff. And the focus/blur group - blur_strength (default 90), blur_focus_spread, focal_depth - creates a depth-of-field falloff. There's also a saturation control for the overall color intensity of the look.
The clever part is the optional depth_map input. Feed it a depth map (from any depth-estimation node - MiDaS, Depth Anything, whatever you've got) and the blur becomes a real depth-aware defocus: things at the focal depth stay sharp and everything else falls off by distance, exactly like a real lens. focal_depth picks which depth plane is in focus. Without a depth map it still blurs, but the depth map is what turns a flat blur into a convincing shallow-depth-of-field. That's the input worth wiring up if you care about the look.
The single output is image.
Where it fits: final-stage finishing. Run your generation, do your color grade, then stamp a Film pass on top for grain and mood. It's the kind of node that quietly makes AI images feel more photographic without you being able to point at why. The trap is overdoing it - crank grain_power and vignette_intensity and you get an obviously "filtered" image, which defeats the purpose. Subtle wins: a little grain, a gentle vignette, and depth-aware blur only if your depth map is clean. A bad or misaligned depth map will blur the wrong things, so preview it before trusting it.
Install is the pack standard. Easiest is ComfyUI Manager - search ComfyUI Layer Style (or "LayerStyle"), install, restart. Manual: cd ComfyUI/custom_nodes && git clone https://github.com/chflame163/ComfyUI_LayerStyle, then pip install -r requirements.txt from inside the folder using ComfyUI's Python, and restart. On a hosted ComfyUI it's usually already there. Note that the depth_map is optional and comes from a separate depth node - Film doesn't generate one itself.
The pack-wide caveat: Layer Style is notorious for import failures - install it, restart, and the whole node set shows up red or missing. It's rarely the specific node; it's a dependency clash. The pack pulls a heavy stack (transformers, onnxruntime, opencv), and one mismatched version - a stray transformers or tensorflow being the usual culprit - takes the entire pack down on import. Fix it by reading the ComfyUI startup log for the traceback (it names the package that broke), reinstalling requirements against ComfyUI's own Python, and using Manager's Try Fix. If Film is missing, so is every other LayerStyle node, and that shared import failure is the real thing to fix.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| center_x | FLOAT | 0.500–1 | — |
| center_y | FLOAT | 0.500–1 | — |
| saturation | FLOAT | 1.000.01–3 | — |
| vignette_intensity | FLOAT | 0.500–1 | — |
| grain_power | FLOAT | 0.150–1 | — |
| grain_scale | FLOAT | 1.00.1–10 | — |
| grain_sat | FLOAT | 0.500–1 | — |
| grain_shadows | FLOAT | 0.600–1 | — |
| grain_highs | FLOAT | 0.200–1 | — |
| blur_strength | INT | 900–256 | — |
| blur_focus_spread | FLOAT | 2.20.1–8 | — |
| focal_depth | FLOAT | 0.900–1 | — |
| depth_mapopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |