Add Progressive Effect to an Image
Apply progressive loading effect to any image. Simulate progressive JPEG, interlaced PNG, or pixelation effects with adjustable passes and quality.
About
Progressive image encoding transmits coarse pixel data first, then refines detail in subsequent passes. A standard (baseline) JPEG renders top-to-bottom line by line. A progressive JPEG delivers 4 - 10 scans of increasing frequency coefficients (DC first, then AC bands). The visual result: a blurry full-frame preview sharpens into the final image. This tool recreates that multi-pass refinement process on any input image using client-side Canvas pixel manipulation. You control the number of passes n, the effect type (JPEG-style blur refinement, PNG-style Adam7 interlacing, or block pixelation), and the output quality q. The tool approximates Gaussian blur via three-pass box blur (a well-known optimization where 3 box passes converge to a Gaussian kernel within 3% error). Note: this produces a visual simulation of the progressive loading aesthetic. It does not re-encode the file as an actual progressive JPEG at the byte level. For actual progressive JPEG encoding, a server-side tool like libjpeg with the -progressive flag is required.
Formulas
The progressive blur effect at pass k out of n total passes uses a blur radius that decreases linearly from maximum to zero:
Where rmax = max(w, h) รท 8 is the maximum blur radius derived from image dimensions w and h.
The three-pass box blur approximation of a Gaussian kernel uses a box width computed as:
Where ฯ is the target standard deviation (blur radius) and p = 3 is the number of box passes. The box width is rounded to the nearest odd integer.
For the pixelation effect, the block size at pass k is:
Where smax is the initial block size (largest pixelation). At the final pass (k = n), s = 1 and the original image is restored.
For Adam7 interlacing, pixels are filled according to a fixed 8ร8 grid pattern across 7 passes. Pass k fills pixels at coordinates (x, y) where x mod dxk = oxk and y mod dyk = oyk, using the standard Adam7 offset/stride table.
Reference Data
| Effect Type | Algorithm | Typical Passes | Visual Character | File Format Origin | Use Case |
|---|---|---|---|---|---|
| Progressive JPEG | DCT coefficient layering | 4 - 10 | Blurry โ sharp | JPEG (ITU-T T.81) | Web images, perceived speed |
| Interlaced PNG | Adam7 (7-pass grid fill) | 7 | Sparse dots โ full grid | PNG (ISO 15948) | Large PNG assets |
| Interlaced GIF | 4-pass row interleave | 4 | Every 8th row โ fill | GIF89a | Legacy web graphics |
| Pixelation (Mosaic) | Nearest-neighbor downscale | 3 - 8 | Blocky โ crisp | N/A (artistic) | Retro effects, censoring |
| Box Blur | Separable 1D convolution | 3 | Uniform softening | N/A (kernel filter) | Blur approximation |
| Gaussian Blur | 2D normal distribution kernel | 1 | Natural soft focus | N/A (kernel filter) | Depth-of-field, smoothing |
| Lanczos Resampling | Sinc-windowed interpolation | 1 | Sharp upscale | N/A (resampling) | High-quality resize |
| Bilinear Interpolation | Linear weight of 4 neighbors | 1 | Smooth but soft upscale | N/A (resampling) | Canvas default resize |
| Nearest Neighbor | Copy closest pixel | 1 | Pixelated, crisp edges | N/A (resampling) | Pixel art, retro |
| Progressive WebP | Chunk-based refinement | 2 - 4 | Block โ refined | WebP (Google VP8) | Modern web delivery |
| FLIF (Free Lossless) | MANIAC entropy + interlace | 1 - 4 | Responsive truncation | FLIF | Archival, responsive images |
| AVIF Progressive | AV1 scalable layers | 2 - 3 | Layer refinement | AVIF (AOM) | Next-gen web images |
Frequently Asked Questions
canvas.toBlob('image/jpeg', quality) method produces a baseline JPEG in all current browser implementations. This tool visually simulates the progressive loading aesthetic by applying decreasing blur/pixelation across animated passes. For true progressive JPEG encoding, use server-side tools: jpegtran -progressive, mozjpeg, or ImageMagick with -interlace Plane.