📊 Measured locally · August 2026 · data annex
We encoded 39 test images 954 times across JPEG, WebP and AVIF, plus seven PNG strategies, and published every headline number. No vendor marketing, no hand-typed figures: every table below is generated directly from the raw measurement JSON at build time.
MethodologyMatched qualityJPEG ladder PNG strategiesSpeedFree toolsTakeaways
Compression advice is usually folklore: a blog post says WebP is “30% smaller”, someone else says 25%, and nobody says on which files, at which quality, or how it was measured. We got tired of arguing from vibes, so we ran the numbers ourselves and published them. This page is the data annex of this site: two local test campaigns — one from August 30, 2026 (27 real-world photographs) and one from August 31, 2026 (12 synthetic 1920×1080 frames) — all encoded on our own machine with open-source encoders.
The short version, for the impatient: at matched visual quality (~39.6 dB PSNR) AVIF q70 was -22.6% smaller than JPEG q80, and WebP q85 was -7.5% smaller. The JPEG sweet spot is real: q75–85 delivers most of the achievable quality for a fraction of q95’s weight. PNG photographs shrink through palettes and resizing, not through optimizer flags. And every byte of that size advantage has a CPU price: AVIF encoded the same batch 17× slower than JPEG.
Methodology
Everything on this page comes from scripted, repeatable runs. The raw results live in JSON files, the charts are rendered from the same files, and the tables on this page are generated from them at build time — a number can’t drift away from its source.
27 real-world photographs (mixed subjects, normalized to a maximum width of 1920 px) plus 12 procedurally generated 1920×1080 frames — gradients, grain, silhouettes — used for the timing runs. 39 files in total.
Pillow 11.3.0 with libjpeg (JPEG, optimize + progressive), libwebp (WebP, method=6, the slowest and most thorough effort setting) and libavif via the pillow-avif plugin (AVIF, speed=6).
Exact file size in bytes, and PSNR against the original RGB pixels. PSNR medians were computed on a 12-photo subsample for the photo campaign and on 3 frames for the timing campaign.
August 30–31, 2026, on one local machine. No cloud APIs, no uploads and no third-party service in the measurement path.
One machine, one encoder stack, medians that hide per-file spread, and PSNR as a proxy — a metric, not a verdict. This is a documented local test, not a certified lab. Your files will differ; the method is what we stand behind.
Three JSON artifacts hold the raw measurements: per-file sizes, medians, PSNR and timings. Re-running the benchmark scripts regenerates every figure, chart and table on this page.
Comparing “quality 80” across formats is meaningless — q80 means something different inside every encoder. The fair comparison is at equal visual quality, so we matched by PSNR: JPEG q80 is the anchor at 39.6 dB median PSNR across the 27 photos; the nearest settings for the other encoders are WebP q85 (39.2 dB) and AVIF q70 (40.4 dB). At that footing, the median file sizes diverge sharply.
| Format | Quality setting | Median size | PSNR | vs JPEG q80 |
|---|---|---|---|---|
| JPEG | q80 | 314 KB | 39.6 dB | baseline |
| WebP | q85 | 291 KB | 39.2 dB | -7.5% |
| AVIF | q70 | 243 KB | 40.4 dB | -22.6% |
Deltas are computed on exact byte medians (JPEG 321,833 B · WebP 297,726 B · AVIF 248,979 B), before the KB rounding shown above.
AVIF describes the same pixels with roughly a fifth fewer bytes at this quality level — measured file-by-file on real photographs, not extrapolated from marketing. WebP’s smaller advantage at q85 is the cost of its simpler block model. If maximum compatibility matters, WebP still shrinks files decisively; if bytes matter most, AVIF is the measured winner.
For the format everyone still ships, here is the full ladder on the same 27 photos: median file size and median PSNR at every standard quality setting from q50 to q95.
| Quality | Median size | PSNR |
|---|---|---|
| q50 | 198 KB | 33.3 dB |
| q60 | 240 KB | 34.2 dB |
| q70 | 273 KB | 37.2 dB |
| q75 | 286 KB | 38.2 dB |
| q80 | 314 KB | 39.6 dB |
| q85 | 328 KB | 40.6 dB |
| q90 | 359 KB | 42.2 dB |
| q95 | 458 KB | 43.9 dB |
The measurable sweet spot sits at q75–85. Climbing from q50 to q75 adds 44% file size but buys 4.9 dB of PSNR; climbing from q90 to q95 adds 99 KB (27.6%) for only 1.7 dB. Concretely, q80 files were 31% smaller than q95 files in our run — a saving most viewers would not spot on photographic content, with a PSNR gap of 4.3 dB. Dropping below q70 starts to cost real fidelity (34.2 dB at q60), so bulk pipelines rarely benefit from going there.
PNG is lossless, so an “optimization” can’t throw detail away — it can only change how pixels are represented: encode more efficiently, reduce the palette, or reduce the image itself. We saved the same 27 photographs as PNG seven ways to separate those effects. Note that the resized rows change the image dimensions, so they are a different trade-off rather than a free lunch.
| Strategy | Median size | vs baseline |
|---|---|---|
| Plain default export | 2,475 KB | baseline |
| optimize=True | 2,469 KB | -0.2% |
| Palette reduced to 256 colors | 786 KB | -68.2% |
| Palette reduced to 128 colors | 684 KB | -72.4% |
| Resized to 75% of original size | 1,389 KB | -43.9% |
| Resized to 50% of original size | 626 KB | -74.7% |
| WebP lossless (format swap) | 1,616 KB | -34.7% |
The lesson is blunt. optimize=True alone shaved -0.2% — the encoder was already doing the smart thing by default. Reducing the palette to 256 colors cut -68.2%; halving the resolution cut -74.7%. If the image must stay a lossless PNG, palettes are the honest lever; if it doesn’t have to stay PNG at all, WebP lossless (-34.7% smaller here) or a lossy format beats everything.
The separate timing campaign tells the same story on 12 synthetic frames: raw 24-bit PNG median 2,433 KB, optimize=True 2,228 KB (-8%), palette-256 1,048 KB (-57%), palette-64 665 KB (-73%).
Smaller files are not free: the encoder has to think. We timed full 12-file batches at q80 on the 1920×1080 frames, wall-clock, in-process, same machine for every format.
| Encoder & setting | 12-file batch | Per image | vs JPEG |
|---|---|---|---|
| JPEG q80 (optimize, progressive) | 0.24 s | 20 ms | 1× |
| WebP q80 (method=6) | 2.20 s | 183 ms | 9.2× |
| AVIF q80 (speed=6) | 4.09 s | 341 ms | 17× |
| PNG (optimize=True) | 20.45 s | 1,704 ms | 85× |
AVIF took 4.09 s to encode a batch JPEG finished in 0.24 s — 17× slower, the exact price of its size advantage. WebP method=6 sat in between at 9.2×. Plain PNG with optimize=True was the slowest of all (85× JPEG) while saving the least. Read it as a deployment guide: AVIF for final exports and static assets where encoding happens once, WebP for a speed/savings compromise, JPEG when compute is the constraint. Absolute timings are single-machine; the ordering is the robust part.
Popular “free” compressors come with constraints. To be completely explicit about method: the table below is research, not benchmarking. We collected publicly advertised limits from each vendor’s own pages and third-party write-ups; we did not measure these services, the limits can change at any time without notice, and none of the measured numbers on this page depend on them. Treat this as a snapshot of documented behavior.
| Tool | Documented free-tier limits |
|---|---|
| TinyPNG | Web app: up to 20 images per batch, 5 MB maximum per image. Developer API: 500 free compressions per month. |
| iLoveIMG | Free batch processing limited to roughly 15 files per task; a paid plan raises the cap. |
| Squoosh | Runs entirely in your browser with no server upload; processes one file at a time. |
Our benchmark tooling works the way Squoosh does — fully local — but with batch capability, and that is also how our own tools are built: files never leave your device during processing, and we impose no session caps or per-file MB ceilings; your browser’s available memory is the only practical limit.
Put the numbers to work
The same encoders measured above, running free in your browser.
The measured size winner: roughly 22.6% lighter than JPEG q80 at matched quality.
Convert to AVIF →The compatibility play: 7.5% smaller than JPEG at matched quality, supported everywhere.
Convert to WebP →Stay on JPEG q75–85 and still cut weight — compress JPG, PNG and WebP in one place.
Compress images →Read the full write-ups on the blog: JPEG vs WebP vs AVIF — real numbers and JPEG quality 75 vs 85 vs 95 — a visual test.