Film grain
Give your images that 35mm texture without leaving the graph
- image
- ui_widget
- image
- image_list
Clean AI output is almost too clean. Film grain is the classic fix - a layer of fine noise that breaks up the plastic-smooth gradients diffusion models love to produce and gives the image a photographic texture. LF_FilmGrain applies it as a post-process filter, with controls for strength, grain size, tint and blend mode, and it runs on single images or whole batches.
It sits at the end of your pipeline, after VAE decode, before the save - the classic spot for "make it look shot on film." Photorealistic work benefits the most: grain masks the slight banding and over-smoothing that give away a generated image, and it does it more convincingly than any "film simulation" filter in a photo editor, because it's happening in your actual pipeline.
How it works
Grain is additive noise, scaled and blended into the image. The four required controls do the shaping:
intensity(0–1, default 0.5) - the strength of the effect. Start low; a little goes a long way.size(0.5–5, default 1) - the grain scale. Smaller = finer, more film-like grain; larger = chunkier, more stylized.tint(hex string, defaultFFFFFF) - the grain color. White is neutral; a warm or cool tint nudges the whole image's mood.soft_blend(boolean) - when on, uses a soft blending mode instead of plain overlay, which lays the grain in more gently on highlights.
Outputs are image (single) and image_list (the same result as a list), so it slots cleanly into either a single-image chain or a batch pipeline. The KUL_COMPARE widget even lets you preview before/after right on the node, which is a genuinely useful touch for tuning intensity.
Installing it
It's part of LF Nodes:
cd ComfyUI/custom_nodes
git clone https://github.com/lucafoscili/comfyui-lf
Restart ComfyUI, or install via ComfyUI Manager by searching LF Nodes. No model downloads - this is pure image processing, and the pack's dependencies (numpy, Pillow, opencv-python) cover it.
Gotchas
The classic beginner move is cranking intensity to 1.0 and getting a noisy mess. Grain should read as texture, not static - try 0.1–0.3 with size around 0.5–1 for a film look, and let soft_blend smooth out the worst of it. Also remember the tint is a hex string; paste FFFFFF if you want neutral and it's not already set.
Also: don't grain before other filters. Grain is a finishing touch - put it after upscaling and color work, not before, or you'll just be blurring and re-stretching the noise.
The pack note, briefly: comfyui-lf is legacy (frozen Feb 2025) and the author's active work lives in lucafoscili/lf-nodes, where the filter widgets got rebuilt on the new LF Widgets library. The frozen build works fine.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Input image tensor or a list of image tensors. | |
| intensity | FLOAT | 0.500–1 | Controls the strength of the film grain effect. |
| size | FLOAT | 1.00.5–5 | Controls the size of the grain. Smaller values = finer grain. |
| tint | STRING | FFFFFF | Hexadecimal color (default is FFFFFF for no tint). |
| soft_blend | BOOLEAN | false | If True, uses a soft blending mode for the grain. |
| ui_widgetopt | KUL_COMPARE | [object Object] | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| image_list | IMAGE | — |