Grain
Grain adds film grain by pushing each pixel's red, green and blue up or down by a random offset, drawn from a seeded Mulberry32 generator rather than Math.random. Because the noise depends only on the seed and the image dimensions, the same settings always produce the same grain — the preview holds still while you drag a slider, and an export can be repeated exactly. Amount runs 0 to 100, grain size 1 to 8 pixels per block, and two toggles decide whether the offset is monochrome and whether it is weighted toward the shadows.
How it works
- Drop your images Drag one or more files onto the drop area. The preview draws the grain live as you set it.
- Set the amount The amount slider runs 0 to 100 and starts at 18. Past about 40 it stops reading as film and starts reading as damage.
- Set the grain size Noise is drawn in square blocks of 1 to 8 pixels. Larger blocks are coarser, closer to a fast film stock.
- Choose monochrome or color speckle Monochrome grain, on by default, uses one offset for all three channels. Turn it off for color speckle, which reads as digital noise. "Shadows only" weights the grain by inverse luminance, the way film breaks up in the dark and holds in the light.
- Set the seed and process Type a seed from 0 to 999999 or press Reroll for a new one, then press Process. The first file of the batch is also encoded without grain, so the notice can report what the noise actually cost in bytes.
Questions
- Does adding grain make the file bigger?
- Almost always, and Grain measures it rather than guessing. Noise is exactly the detail an encoder throws away first, so a grained JPEG or WebP is larger than the same image without it. After you press Process, the tool encodes the first file of the batch a second time with the grain turned off and reports both sizes and the percentage difference.
- Can I reproduce the same grain later?
- Yes. Grain uses a seeded Mulberry32 generator and draws one noise value per block before any pixel in that block is read, so the sequence depends on the seed and the image dimensions and never on the image content. Two runs with the same seed, size and dimensions produce byte-identical output. The seed is a number from 0 to 999999 that you can type in directly.
- Why does the grain in the preview look different from the export?
- The preview is drawn no larger than 1000 pixels on its long edge, with the block size scaled down to match, so it shows the same texture at the same relative coarseness but not the same pixels. When the block size is above 1 pixel and the preview is smaller than the source, Grain says so and names the width it drew at. The export always carries the block size you set, at full resolution.
Every tool