Film grain, halation, light leaks, dust & scratches, vignette — emulate Portra, Velvia, Kodachrome, and more. GPU-accelerated, entirely in your browser.
Drop a photo here or click to choose
You can also paste from clipboard (Ctrl/Cmd+V)
JPG · PNG · WebP — processed locally, never uploaded
Procedural overlays generated in the shader — no external images needed.
Every effect runs as a WebGL 2-pass fragment shader — GPU-accelerated processing that happens entirely inside your browser. Your image is never sent to a server.
A hash-based pseudo-random noise function generates per-pixel luminance variation that mimics silver halide crystal scatter. Grain is luminance-weighted — coarser in midtones and shadows (where film grain is most visible), finer in highlights, matching how real film behaves. Each "Re-roll" re-seeds the noise for a fresh pattern.
Each preset applies per-channel lift/gamma/gain curves (ASC CDL color math) that replicate the color science of classic film stocks: warm mid shadows (Portra), saturated greens and blues (Velvia), warm red bias (Kodachrome), and more. You can dial in saturation, contrast, shadow tint, and exposure on top of any preset.
Bright areas bleed a warm red-orange glow — the result of light scattering between film emulsion layers in real analog film. The shader detects luminance above a threshold (~0.65), blurs those highlights in a separate off-screen framebuffer, then composites that warm orange tint onto the main image.
A radial distance function darkens the corners relative to the center, replicating the natural light falloff of wide-aperture vintage lenses. The softness slider controls the gradient width — tight for dramatic edge darkening, wide for a gentle natural falloff. Elliptical correction keeps the vignette round even on tall or wide photos.
Procedural warm-orange gradient blooms are synthesized in the shader using trigonometric functions, placing two to three overlapping lens-flare-like washes of orange-yellow light near the corners and edges. No pre-made texture image is loaded — the pattern is fully parametric and responds to the intensity slider.
A deterministic hash pattern generates tiny dark specks and thin horizontal scratch lines at fixed positions (seeded from the same grain seed), mimicking the look of dust on a film scanner bed or scratches from an old film transport mechanism. Density controls how many artifacts appear.
No — never. The image is read directly from your device into your browser's memory and processed using your GPU via the WebGL API built into every modern browser. No data leaves your computer at any point. You can disconnect from the internet after loading this page and it will continue to work fully.
Portra 400 is Kodak's signature warm, skin-friendly portrait stock with lifted shadows and slight red-orange shift in midtones. Velvia 50 is Fuji's hyper-saturated landscape film — punchy greens, deep blues, high contrast. Kodachrome 64 is the iconic 1970s slide film with a warm red-orange bias, moderate contrast, and lifted shadows. HP5 Pushed is Ilford's classic black-and-white push-processed stock with strong contrast and visible grain. Cinestill 800T is a cinema film variant with dramatic red halation and a cool tungsten color cast. Ektachrome E100 is Kodak's cool, crisp slide film with slightly elevated blues and precise colors. Lomo 400 mimics cross-processed slide film — oversaturated, high contrast, with strong magenta and cyan shifts. Gold 200 replicates the warm, slightly desaturated look of budget consumer print film from the 1990s.
Each preset sets grain, fade, halation, and color curves — but every slider remains fully adjustable after applying a preset.
Halation is a warm red or orange bloom around very bright areas in film photos — street lights, windows, skin in direct sun. It happens because light passes through the film emulsion, hits the backing layer, and scatters back, re-exposing the emulsion with a soft red cast. The Cinestill 800T preset cranks halation high because that film is famous for dramatic neon halation in night photography. Cinestill 800T is actually Kodak Vision3 cinema film re-rolled for still cameras — and it famously retains the halation that cinema film normally has removed by an anti-halation backing.
Click Compare to enter split view. Drag the center divider left or right to reveal different amounts of the original and the film-effect version side by side. This lets you judge exactly how much each effect changes the image. Click Result to return to the full filtered view, or Original to temporarily see the unmodified photo.
Input: JPEG, PNG, and WebP — any image format that modern browsers can display. You can drag and drop, click to browse, or paste directly from your clipboard (Ctrl/Cmd + V).
Output: JPEG at your chosen quality (60–100%), PNG (lossless), or WebP (best compression for web sharing). For social sharing, JPEG at 85–90% or WebP give the best balance of file size and quality. Use PNG if you want to preserve exact pixel values for further editing in another tool.
Photos above about 4000px on the longest side are capped at 3000px for WebGL memory limits on mobile. The cap only applies to processing — your original file is unchanged.
The grain pattern is generated from a random seed number. Each time you download, the tool re-seeds the random noise function, producing a fresh grain pattern — just like how each frame of real film has a unique, unrepeatable silver halide scatter. If you want the same grain across multiple exports, use the Re-roll button to settle on a pattern you like before hitting Download (the displayed preview will match what you download).
Yes — WebGL is supported on all modern iOS (Safari 15+) and Android (Chrome) browsers. The interface is fully responsive down to 360px wide. Large photos (above ~12 MP) may take 1–2 seconds to render on older mobile hardware. The light leak and dust overlay effects add a tiny amount of extra GPU work, so disable them if you experience slowness on very old devices.