Nodes/ComfyUI-Image-Effects/๐ŸŽž๏ธ Film Grain
ComfyUI Node

๐ŸŽž๏ธ Film Grain

The Analog-Texture Finisher That Kills the Plastic AI Look

By orion4dยทCreated about a year agoยทUpdated about a year agoยท 28
๐ŸŽž๏ธ Film Grain
  • image
  • IMAGE
โ—„grain_intensity0.30โ–บ
โ—„grain_size1.0โ–บ
โ—„film_type35mmโ–บ
โ—„color_graintrueโ–บ
โ—„vintage_tone0.20โ–บ
โ—„vignette0.10โ–บ

Film Grain adds the fine, organic noise of photochemical film to your render - and it's one of the most useful little lies in AI imaging. That "too smooth, plastic skin" look that gives AI images away is largely a lack of texture, and a thin layer of real grain is the single cheapest fix in the book. Grain also does double duty hiding banding in smooth gradients, which is why it's the go-to finishing move for photorealism workflows. It belongs at the very end of your graph, after upscaling - grain before upscale gets smoothed away.

It's one of the pack's Vintage effects, and it's the one with the most legitimate everyday use beyond pure nostalgia.

How it works

The node generates Gaussian noise and blends it over the image, but it models film, not generic static. Different film_type presets - 35mm, 16mm, 8mm, super8 - carry different grain scales and characteristics (8mm is chunky and harsh, 35mm is fine and refined). With color_grain on, the RGB channels get independent noise (real film grain has color in it); off, you get monochrome grain that reads as a more "neutral" texturizer. The grain is generated per-channel at the intensity you set, which keeps it from looking like a flat gray overlay.

The two extras round out the vintage package: vintage_tone adds a subtle warm/cool cast that fakes film stock color response, and vignette darkens the edges with a soft radial falloff. Both are optional and default to near-zero so you can use this purely as a texture layer.

The inputs that matter

  • grain_intensity (0โ€“1, default 0.3) - amount of grain. 0.2โ€“0.4 is the sweet spot; past 0.6 it's an effect, not a texturizer.
  • grain_size (0.1โ€“3, default 1) - coarseness of the grain particles.
  • film_type - 35mm, 16mm, 8mm or super8. Pick your era.
  • color_grain (on) - colored vs monochrome grain.
  • vintage_tone (0โ€“1, default 0.2) - film-stock color cast.
  • vignette (0โ€“1, default 0.1) - edge darkening.

Output is the grained IMAGE.

Installing it

Ships in ComfyUI-Image-Effects (Orion4D). ComfyUI Manager โ†’ search "Image Effects", or:

cd ComfyUI/custom_nodes
git clone https://github.com/orion4d/ComfyUI-Image-Effects
cd ComfyUI-Image-Effects
pip install -r requirements.txt

Restart, then it's under Add Node โ†’ Image Effects. No models - just NumPy for the noise and OpenCV/Pillow for the blend.

Gotchas

Pack-wide: only the first image of a batch is processed, and the noise is random with no seed - every run gets slightly different grain, which is fine (nobody can see it), but don't expect identical files across runs. The real mistake people make is ordering: grain before an upscaler gets averaged out and you get smooth plastic back. Always put it last. And if your goal is just de-plastifying a face, run it at low intensity with color_grain on - the per-channel noise is what makes it read as film rather than a dust filter.

CategoryImage Effects

Inputs (7)

NameTypeDefaultDescription
imageIMAGEโ€”
grain_intensityFLOAT0.300โ€“1โ€”
grain_sizeFLOAT1.00.1โ€“3โ€”
film_typeCOMBO35mm4 options: 35mm, 16mm, 8mm, super8
color_grainoptBOOLEANtrueโ€”
vintage_toneoptFLOAT0.200โ€“1โ€”
vignetteoptFLOAT0.100โ€“1โ€”

Outputs (1)

NameTypeDescription
IMAGEIMAGEโ€”