Nodes/WAS Node Suite v3/Image Film Grain
ComfyUI Node Runs on cloud

Image Film Grain

The post-process that makes AI images look shot, not rendered

By WASasquatch·Created 4 years ago·Updated about 18 hours ago· 1,880
Image Film Grain
  • image
  • IMAGE
◄strength0.030►
◄grain_size1.5►
◄color0.00►
◄seed0►

One of the quiet giveaways of an AI image is that it's too clean - surfaces are smooth in a way real photographs never are. Image Film Grain adds a layer of grain on top of your generated image, and that small bit of texture does an outsized amount of work toward making the result read as captured rather than rendered. The WAS README description is just "Apply film grain to a image," but the photorealism playbook explains why it punches above its weight: "adding subtle noise in post makes images look captured rather than generated."

This is a finishing move. You run it after generation, at the very end of your workflow, as one of the last things before you save. It sits alongside the other analog-emulation tricks - chromatic aberration, subtle lens distortion, vignetting - that the community leans on to fake the imperfections of real cameras.

How it works

It overlays noise onto the image's pixels, mimicking the random silver-halide grain of photographic film. Because the grain is applied uniformly and at fine scale, it breaks up the unnaturally smooth gradients that make AI output feel plastic, without meaningfully changing the content. The result is an image your eye reads as having been through a physical process. WAS's suite is, as the ecosystem notes describe it, exactly this kind of "large collection of image processing utilities" for post steps core ComfyUI doesn't include, and film grain is one of the most-reached-for.

The inputs and outputs that matter

  • The image in - your finished generation.
  • A grain strength / amount - how heavy the grain is. This is the knob that matters, and the whole game is restraint: the photorealism advice is "subtle." A little sells realism; a lot looks like a deliberate vintage filter.
  • The grained image out - wire it straight to your save node.

I'm describing the controls from the node's job and the photorealism guidance rather than a formal schema, so I won't invent exact widget names - but strength is the one you'll actually touch.

How to install it

Part of the WAS Node Suite:

  • ComfyUI Manager: search was-node-suite-comfyui, install, restart.
  • Manually: cd ComfyUI/custom_nodes && git clone https://github.com/WASasquatch/was-node-suite-comfyui/, then pip install -r requirements.txt against your ComfyUI Python, and restart.

Pure pixel filter - no model download, no heavy dependency.

Common issues

The number-one mistake is overdoing it. Crank the grain and your image stops looking like film and starts looking like a noisy JPEG - heavy grain reads as an artifact, not an aesthetic. Start low and add. If viewers notice the grain, it's probably too much; the effect works best when it registers subconsciously.

Second: apply it last, at full resolution. If you add grain and then upscale, the upscaler smears and resamples the grain into something mushy, and you lose the crisp fine texture that was the whole point. Grain also doesn't survive aggressive re-compression well, so make it one of the final steps before the save, after any upscaling or resizing.

One more: grain interacts with other film effects. Stack it with chromatic aberration and a vignette and a little grain goes a long way - dial each one back when you're combining them, or the "analog" look tips over into "heavily filtered."

And the pack caveat: WAS Node Suite has been retired since December 2023 - heavily used, unmaintained. If a ComfyUI update makes every WAS node vanish with an "Import Failed", that's suite-level dependency drift, not this node. Re-run requirements.txt against the correct Python environment (or the bundled install.bat) and restart.

CategoryWAS Suite/Image/Filter

Inputs (5)

NameTypeDefaultDescription
imageIMAGEThe image or batch to add grain to. Values above white are kept, and an alpha channel is left as it was.
strengthFLOAT0.0300–0.50 = no grain, image unchanged; 0.03 = fine film grain; 0.06 = coarse, pushed film; 0.15 = heavy. Grain shows most on smooth areas such as skin and sky.
grain_sizeFLOAT1.50.5–8Width of one grain clump in pixels. 1 = fine and crisp; 1.5 = soft film grain; 3 = coarse. Raise it with the frame size: 2 to 3 suits a 4K frame.
colorFLOAT0.000–10 = the same grain on red, green and blue, like black-and-white film; 0.25 = a hint of colour, like colour negative; 1 = separate grain per channel, which reads as digital noise.
seedINT00–18446744073709550000Which grain pattern: `0` and `1` give two different ones, and one seed always gives the same. Each frame of a batch draws its own, so grain moves on video like it does on film.

Outputs (1)

NameTypeDescription
IMAGEIMAGEThe image with grain added.