BlazeDiff vs zune-png
blazediff-png decodes ~1.6x faster
than zune-png natively, and ~19% faster
in WebAssembly. zune-png is one of the fastest pure-Rust PNG decoders. In our
benchmarks its encoder writes stored (uncompressed) data at every level, so its
compressed-encode bars measure a different job.
zune-png is part of the zune-image family, which also covers JPEG, QOI, PSD, HDR
and JPEG XL. It supports no_std and composites APNG frames. blazediff-png is a
PNG-only codec with libspng output parity, real deflate compression, and Node and
WebAssembly packages.
At a glance
| zune-png | BlazeDiff (blazediff-png) | |
|---|---|---|
| License | MIT OR Apache-2.0 OR Zlib | MIT |
| Language | Rust, unsafe only for SIMD | Rust with SIMD kernels; C zlib and libdeflate by default |
no_std | Yes | No |
| APNG | Yes, with frame compositing | No |
| Encode | Stored data in these benchmarks | Stored, or libdeflate levels 1 to 12 (fdeflate in wasm) |
| WebAssembly | Build it yourself (zune-wasm on npm is from 2024) | @blazediff/codec-png-wasm, about 150 KB with SIMD |
| Parity reference | Cross-checked against the png crate | Byte-identical to libspng |
Benchmarks
Native Rust, single-threaded, decode to RGBA8:
Decode (PNG to RGBA8)
TOTAL TIME, BEST-OF Β· 36 FIXTURES Β· IO EXCLUDED
Apple M1 Max Β· darwin/arm64 Β· Node v22.14.0 Β· rustc 1.97.1 (8bab26f4f 2026-07-14) Β· best-of, iterations scaled by image size, single-threaded Β· 2026-10-22 Β· 234b300-dirty Β· pnpm benchmark png
Per-fixture results (36)
| Fixture | MPx | blazediff | spng | image-rs | zune | blazediff vs spng | image-rs vs spng | zune vs spng |
|---|---|---|---|---|---|---|---|---|
| 4k/1a.png | 17.9 | 138ms | 179ms | 152ms | 209ms | 1.30x | 1.18x | 0.86x |
| 4k/1b.png | 17.9 | 125ms | 187ms | 145ms | 196ms | 1.50x | 1.29x | 0.95x |
| 4k/2a.png | 20.0 | 158ms | 279ms | 194ms | 234ms | 1.76x | 1.44x | 1.19x |
| 4k/2b.png | 20.0 | 160ms | 221ms | 196ms | 235ms | 1.39x | 1.13x | 0.94x |
| 4k/3a.png | 24.0 | 160ms | 220ms | 194ms | 265ms | 1.38x | 1.14x | 0.83x |
| 4k/3b.png | 24.0 | 160ms | 220ms | 200ms | 266ms | 1.37x | 1.10x | 0.83x |
| alpha/1a.png | 0.0 | 0.08ms | 0.20ms | 0.07ms | 0.11ms | 2.37x | 2.64x | 1.76x |
| alpha/1b.png | 0.0 | 0.09ms | 0.20ms | 0.08ms | 0.11ms | 2.31x | 2.57x | 1.73x |
| blazediff/1a.png | 0.4 | 0.60ms | 0.69ms | 0.71ms | 1.01ms | 1.14x | 0.97x | 0.68x |
| blazediff/1b.png | 0.4 | 0.60ms | 0.70ms | 0.71ms | 1.01ms | 1.15x | 0.98x | 0.69x |
| blazediff/2a.png | 0.4 | 0.62ms | 0.83ms | 0.69ms | 0.93ms | 1.36x | 1.21x | 0.90x |
| blazediff/2b.png | 0.4 | 0.66ms | 0.85ms | 0.73ms | 1.02ms | 1.30x | 1.17x | 0.84x |
| blazediff/3a.png | 1.6 | 10.86ms | 13.38ms | 12.10ms | 17.55ms | 1.23x | 1.11x | 0.76x |
| blazediff/3b.png | 1.6 | 10.83ms | 13.25ms | 12.12ms | 17.45ms | 1.22x | 1.09x | 0.76x |
| blazediff/4a.png | 3.8 | 2.80ms | 3.41ms | 3.38ms | 4.43ms | 1.22x | 1.01x | 0.77x |
| blazediff/4b.png | 3.8 | 2.93ms | 3.48ms | 3.42ms | 4.49ms | 1.19x | 1.02x | 0.78x |
| page/1a.png | 58.9 | 156ms | 236ms | 184ms | 255ms | 1.52x | 1.28x | 0.93x |
| page/1b.png | 58.9 | 156ms | 234ms | 184ms | 246ms | 1.50x | 1.28x | 0.95x |
| page/2a.png | 41.7 | 26.12ms | 36.51ms | 20.21ms | 47.56ms | 1.40x | 1.81x | 0.77x |
| page/2b.png | 41.7 | 26.46ms | 35.71ms | 20.65ms | 58.02ms | 1.35x | 1.73x | 0.62x |
| pixelmatch/1a.png | 0.1 | 0.74ms | 0.95ms | 0.67ms | 1.07ms | 1.28x | 1.42x | 0.89x |
| pixelmatch/1b.png | 0.1 | 0.55ms | 0.71ms | 0.53ms | 0.89ms | 1.30x | 1.35x | 0.80x |
| pixelmatch/2a.png | 0.1 | 0.11ms | 0.37ms | 0.12ms | 0.15ms | 3.32x | 3.03x | 2.41x |
| pixelmatch/2b.png | 0.1 | 0.11ms | 0.38ms | 0.12ms | 0.15ms | 3.34x | 3.18x | 2.43x |
| pixelmatch/3a.png | 0.1 | 0.50ms | 0.73ms | 0.47ms | 0.74ms | 1.46x | 1.57x | 0.98x |
| pixelmatch/3b.png | 0.1 | 0.50ms | 0.72ms | 0.46ms | 0.74ms | 1.45x | 1.56x | 0.97x |
| pixelmatch/4a.png | 0.2 | 1.08ms | 1.83ms | 1.36ms | 1.74ms | 1.69x | 1.35x | 1.06x |
| pixelmatch/4b.png | 0.2 | 1.31ms | 1.75ms | 1.36ms | 2.20ms | 1.34x | 1.29x | 0.80x |
| pixelmatch/5a.png | 0.1 | 0.29ms | 0.43ms | 0.28ms | 0.37ms | 1.48x | 1.53x | 1.17x |
| pixelmatch/5b.png | 0.1 | 0.29ms | 0.43ms | 0.27ms | 0.36ms | 1.47x | 1.60x | 1.19x |
| pixelmatch/6a.png | 0.1 | 0.35ms | 0.66ms | 0.38ms | 0.46ms | 1.87x | 1.71x | 1.42x |
| pixelmatch/6b.png | 0.1 | 0.60ms | 0.94ms | 0.51ms | 0.84ms | 1.56x | 1.85x | 1.12x |
| pixelmatch/7a.png | 0.3 | 0.19ms | 0.47ms | 0.18ms | 0.31ms | 2.50x | 2.58x | 1.49x |
| pixelmatch/7b.png | 0.3 | 0.18ms | 0.46ms | 0.19ms | 0.31ms | 2.58x | 2.49x | 1.48x |
| same/1a.png | 1.7 | 2.09ms | 2.53ms | 2.63ms | 9.23ms | 1.21x | 0.96x | 0.27x |
| same/1b.png | 1.7 | 2.09ms | 2.53ms | 2.64ms | 9.28ms | 1.21x | 0.96x | 0.27x |
| TOTAL | 1.31s | 1.90s | 1.53s | 2.09s | 1.46x | 1.24x | 0.91x |
Encode, no compression
TOTAL TIME, BEST-OF Β· 36 FIXTURES Β· IO EXCLUDED
Levels: blazediff stored Β· spng stored Β· image-rs stored Β· zune stored.
Apple M1 Max Β· darwin/arm64 Β· Node v22.14.0 Β· rustc 1.97.1 (8bab26f4f 2026-07-14) Β· best-of, iterations scaled by image size, single-threaded Β· 2026-10-22 Β· 234b300-dirty Β· pnpm benchmark png
Per-fixture results (36)
| Fixture | MPx | blazediff | spng | image-rs | zune | blazediff vs spng | image-rs vs spng | zune vs spng |
|---|---|---|---|---|---|---|---|---|
| 4k/1a.png | 17.9 | 4.35ms | 30.16ms | 27.64ms | 56.75ms | 6.93x | 1.09x | 0.53x |
| 4k/1b.png | 17.9 | 4.83ms | 36.47ms | 25.84ms | 68.77ms | 7.56x | 1.41x | 0.53x |
| 4k/2a.png | 20.0 | 4.64ms | 32.07ms | 25.19ms | 71.57ms | 6.91x | 1.27x | 0.45x |
| 4k/2b.png | 20.0 | 4.63ms | 45.57ms | 31.10ms | 69.71ms | 9.84x | 1.47x | 0.65x |
| 4k/3a.png | 24.0 | 5.63ms | 61.56ms | 60.05ms | 82.34ms | 10.94x | 1.03x | 0.75x |
| 4k/3b.png | 24.0 | 5.63ms | 61.71ms | 29.50ms | 72.25ms | 10.97x | 2.09x | 0.85x |
| alpha/1a.png | 0.0 | 0.01ms | 0.04ms | 0.04ms | 0.10ms | 4.66x | 1.09x | 0.43x |
| alpha/1b.png | 0.0 | 0.01ms | 0.04ms | 0.04ms | 0.10ms | 4.69x | 1.08x | 0.43x |
| blazediff/1a.png | 0.4 | 0.10ms | 0.48ms | 0.39ms | 1.18ms | 4.88x | 1.23x | 0.40x |
| blazediff/1b.png | 0.4 | 0.10ms | 0.42ms | 0.39ms | 1.14ms | 4.22x | 1.09x | 0.37x |
| blazediff/2a.png | 0.4 | 0.09ms | 0.36ms | 0.31ms | 0.94ms | 4.26x | 1.18x | 0.39x |
| blazediff/2b.png | 0.4 | 0.08ms | 0.37ms | 0.31ms | 0.94ms | 4.41x | 1.18x | 0.39x |
| blazediff/3a.png | 1.6 | 0.36ms | 2.00ms | 3.51ms | 4.86ms | 5.50x | 0.57x | 0.41x |
| blazediff/3b.png | 1.6 | 0.36ms | 1.98ms | 2.28ms | 4.92ms | 5.50x | 0.87x | 0.40x |
| blazediff/4a.png | 3.8 | 0.87ms | 5.35ms | 5.73ms | 11.38ms | 6.17x | 0.93x | 0.47x |
| blazediff/4b.png | 3.8 | 0.87ms | 6.12ms | 7.87ms | 13.12ms | 7.05x | 0.78x | 0.47x |
| page/1a.png | 58.9 | 16.84ms | 114ms | 117ms | 192ms | 6.76x | 0.97x | 0.59x |
| page/1b.png | 58.9 | 22.59ms | 108ms | 92.34ms | 196ms | 4.77x | 1.17x | 0.55x |
| page/2a.png | 41.7 | 12.32ms | 88.23ms | 109ms | 122ms | 7.16x | 0.81x | 0.72x |
| page/2b.png | 41.7 | 12.08ms | 78.17ms | 53.95ms | 127ms | 6.47x | 1.45x | 0.62x |
| pixelmatch/1a.png | 0.1 | 0.03ms | 0.16ms | 0.10ms | 0.34ms | 5.05x | 1.56x | 0.47x |
| pixelmatch/1b.png | 0.1 | 0.03ms | 0.13ms | 0.10ms | 0.34ms | 4.51x | 1.33x | 0.39x |
| pixelmatch/2a.png | 0.1 | 0.01ms | 0.08ms | 0.06ms | 0.17ms | 5.25x | 1.42x | 0.45x |
| pixelmatch/2b.png | 0.1 | 0.01ms | 0.08ms | 0.05ms | 0.17ms | 5.39x | 1.44x | 0.47x |
| pixelmatch/3a.png | 0.1 | 0.03ms | 0.16ms | 0.10ms | 0.34ms | 5.27x | 1.55x | 0.46x |
| pixelmatch/3b.png | 0.1 | 0.03ms | 0.16ms | 0.10ms | 0.34ms | 5.27x | 1.56x | 0.47x |
| pixelmatch/4a.png | 0.2 | 0.04ms | 0.18ms | 0.15ms | 0.47ms | 4.06x | 1.24x | 0.38x |
| pixelmatch/4b.png | 0.2 | 0.05ms | 0.19ms | 0.16ms | 0.49ms | 4.20x | 1.16x | 0.39x |
| pixelmatch/5a.png | 0.1 | 0.01ms | 0.07ms | 0.05ms | 0.17ms | 4.60x | 1.29x | 0.40x |
| pixelmatch/5b.png | 0.1 | 0.01ms | 0.08ms | 0.05ms | 0.17ms | 5.38x | 1.52x | 0.47x |
| pixelmatch/6a.png | 0.1 | 0.01ms | 0.07ms | 0.05ms | 0.18ms | 4.53x | 1.25x | 0.38x |
| pixelmatch/6b.png | 0.1 | 0.02ms | 0.07ms | 0.05ms | 0.17ms | 4.56x | 1.31x | 0.41x |
| pixelmatch/7a.png | 0.3 | 0.06ms | 0.24ms | 0.20ms | 0.65ms | 4.07x | 1.22x | 0.37x |
| pixelmatch/7b.png | 0.3 | 0.06ms | 0.27ms | 0.20ms | 0.65ms | 4.62x | 1.38x | 0.42x |
| same/1a.png | 1.7 | 0.40ms | 2.07ms | 3.45ms | 4.98ms | 5.17x | 0.60x | 0.42x |
| same/1b.png | 1.7 | 0.40ms | 2.57ms | 3.96ms | 5.88ms | 6.49x | 0.65x | 0.44x |
| TOTAL | 97.60ms | 679ms | 602ms | 1.11s | 6.96x | 1.13x | 0.61x |
Encode, half compression
TOTAL TIME, BEST-OF Β· 36 FIXTURES Β· IO EXCLUDED
Levels: blazediff libdeflate 6 Β· spng zlib 4 Β· image-rs flate2 4 Β· zune stored.
Apple M1 Max Β· darwin/arm64 Β· Node v22.14.0 Β· rustc 1.97.1 (8bab26f4f 2026-07-14) Β· best-of, iterations scaled by image size, single-threaded Β· 2026-10-22 Β· 234b300-dirty Β· pnpm benchmark png
Per-fixture results (36)
| Fixture | MPx | blazediff | spng | image-rs | zune | blazediff vs spng | image-rs vs spng | zune vs spng |
|---|---|---|---|---|---|---|---|---|
| 4k/1a.png | 17.9 | 1.15s | 2.80s | 1.08s | 55.06ms | 2.43x | 2.59x | 50.89x |
| 4k/1b.png | 17.9 | 959ms | 2.51s | 900ms | 62.97ms | 2.61x | 2.78x | 39.80x |
| 4k/2a.png | 20.0 | 963ms | 3.15s | 1.10s | 71.73ms | 3.27x | 2.85x | 43.91x |
| 4k/2b.png | 20.0 | 1.01s | 3.05s | 1.12s | 60.27ms | 3.02x | 2.73x | 50.64x |
| 4k/3a.png | 24.0 | 1.41s | 3.82s | 1.46s | 83.12ms | 2.70x | 2.62x | 45.99x |
| 4k/3b.png | 24.0 | 1.41s | 3.88s | 1.47s | 72.03ms | 2.75x | 2.64x | 53.80x |
| alpha/1a.png | 0.0 | 0.36ms | 2.88ms | 0.37ms | 0.10ms | 8.01x | 7.84x | 30.06x |
| alpha/1b.png | 0.0 | 0.36ms | 2.88ms | 0.38ms | 0.10ms | 7.99x | 7.68x | 30.03x |
| blazediff/1a.png | 0.4 | 3.80ms | 33.99ms | 2.96ms | 1.14ms | 8.95x | 11.48x | 29.83x |
| blazediff/1b.png | 0.4 | 3.83ms | 34.20ms | 2.96ms | 1.15ms | 8.92x | 11.55x | 29.76x |
| blazediff/2a.png | 0.4 | 3.31ms | 27.83ms | 2.59ms | 0.93ms | 8.41x | 10.73x | 29.78x |
| blazediff/2b.png | 0.4 | 3.34ms | 28.06ms | 2.68ms | 0.93ms | 8.40x | 10.49x | 30.25x |
| blazediff/3a.png | 1.6 | 37.88ms | 157ms | 37.58ms | 4.88ms | 4.15x | 4.18x | 32.20x |
| blazediff/3b.png | 1.6 | 36.72ms | 158ms | 37.02ms | 4.98ms | 4.31x | 4.28x | 31.80x |
| blazediff/4a.png | 3.8 | 29.16ms | 292ms | 20.48ms | 11.31ms | 10.02x | 14.26x | 25.83x |
| blazediff/4b.png | 3.8 | 29.18ms | 294ms | 20.45ms | 12.70ms | 10.07x | 14.37x | 23.14x |
| page/1a.png | 58.9 | 822ms | 5.19s | 706ms | 192ms | 6.32x | 7.36x | 27.00x |
| page/1b.png | 58.9 | 829ms | 5.13s | 695ms | 194ms | 6.19x | 7.38x | 26.42x |
| page/2a.png | 41.7 | 629ms | 3.67s | 595ms | 133ms | 5.84x | 6.17x | 27.55x |
| page/2b.png | 41.7 | 619ms | 3.69s | 598ms | 131ms | 5.96x | 6.17x | 28.23x |
| pixelmatch/1a.png | 0.1 | 1.65ms | 11.24ms | 1.72ms | 0.34ms | 6.82x | 6.52x | 33.36x |
| pixelmatch/1b.png | 0.1 | 1.65ms | 11.21ms | 1.73ms | 0.34ms | 6.80x | 6.47x | 32.73x |
| pixelmatch/2a.png | 0.1 | 2.45ms | 8.91ms | 3.20ms | 0.17ms | 3.63x | 2.78x | 51.41x |
| pixelmatch/2b.png | 0.1 | 2.49ms | 9.20ms | 3.31ms | 0.18ms | 3.70x | 2.78x | 50.33x |
| pixelmatch/3a.png | 0.1 | 1.34ms | 10.42ms | 1.16ms | 0.34ms | 7.77x | 8.99x | 30.45x |
| pixelmatch/3b.png | 0.1 | 1.32ms | 10.43ms | 1.16ms | 0.34ms | 7.93x | 9.01x | 30.87x |
| pixelmatch/4a.png | 0.2 | 6.97ms | 24.69ms | 8.84ms | 0.47ms | 3.54x | 2.79x | 52.02x |
| pixelmatch/4b.png | 0.2 | 7.05ms | 25.16ms | 9.30ms | 0.47ms | 3.57x | 2.71x | 53.97x |
| pixelmatch/5a.png | 0.1 | 0.61ms | 5.07ms | 0.58ms | 0.17ms | 8.37x | 8.69x | 29.47x |
| pixelmatch/5b.png | 0.1 | 0.61ms | 5.06ms | 0.58ms | 0.17ms | 8.36x | 8.78x | 29.70x |
| pixelmatch/6a.png | 0.1 | 2.11ms | 7.23ms | 2.44ms | 0.18ms | 3.43x | 2.96x | 40.61x |
| pixelmatch/6b.png | 0.1 | 2.03ms | 6.88ms | 2.14ms | 0.17ms | 3.39x | 3.22x | 40.20x |
| pixelmatch/7a.png | 0.3 | 3.77ms | 22.39ms | 4.05ms | 0.64ms | 5.95x | 5.53x | 34.74x |
| pixelmatch/7b.png | 0.3 | 3.77ms | 22.07ms | 4.03ms | 0.66ms | 5.85x | 5.47x | 33.58x |
| same/1a.png | 1.7 | 15.40ms | 137ms | 12.25ms | 5.18ms | 8.90x | 11.19x | 26.47x |
| same/1b.png | 1.7 | 15.70ms | 140ms | 12.38ms | 5.86ms | 8.92x | 11.30x | 23.91x |
| TOTAL | 10.02s | 38.37s | 9.92s | 1.11s | 3.83x | 3.87x | 34.59x |
Encode size, no compression
TOTAL OUTPUT SIZE Β· 36 FIXTURES
Levels: blazediff stored Β· spng stored Β· image-rs stored Β· zune stored.
Apple M1 Max Β· darwin/arm64 Β· Node v22.14.0 Β· rustc 1.97.1 (8bab26f4f 2026-07-14) Β· best-of, iterations scaled by image size, single-threaded Β· 2026-10-22 Β· 234b300-dirty Β· pnpm benchmark png
Per-fixture results (36)
| Fixture | MPx | blazediff | spng | image-rs | zune | blazediff vs spng | image-rs vs spng | zune vs spng |
|---|---|---|---|---|---|---|---|---|
| 4k/1a.png | 17.9 | 68.4 MB | 68.5 MB | 68.4 MB | 68.5 MB | 99.8% | 99.8% | 100.0% |
| 4k/1b.png | 17.9 | 68.4 MB | 68.5 MB | 68.4 MB | 68.5 MB | 99.8% | 99.8% | 100.0% |
| 4k/2a.png | 20.0 | 76.2 MB | 76.3 MB | 76.2 MB | 76.3 MB | 99.8% | 99.8% | 100.0% |
| 4k/2b.png | 20.0 | 76.2 MB | 76.3 MB | 76.2 MB | 76.3 MB | 99.8% | 99.8% | 100.0% |
| 4k/3a.png | 24.0 | 91.6 MB | 91.7 MB | 91.6 MB | 91.7 MB | 99.9% | 99.9% | 100.0% |
| 4k/3b.png | 24.0 | 91.6 MB | 91.7 MB | 91.6 MB | 91.7 MB | 99.9% | 99.9% | 100.0% |
| alpha/1a.png | 0.0 | 144.3 KB | 144.5 KB | 144.3 KB | 144.5 KB | 99.8% | 99.8% | 100.0% |
| alpha/1b.png | 0.0 | 144.3 KB | 144.5 KB | 144.3 KB | 144.5 KB | 99.8% | 99.8% | 100.0% |
| blazediff/1a.png | 0.4 | 1.6 MB | 1.6 MB | 1.6 MB | 1.6 MB | 99.8% | 99.8% | 100.0% |
| blazediff/1b.png | 0.4 | 1.6 MB | 1.6 MB | 1.6 MB | 1.6 MB | 99.8% | 99.8% | 100.0% |
| blazediff/2a.png | 0.4 | 1.3 MB | 1.3 MB | 1.3 MB | 1.3 MB | 99.8% | 99.8% | 100.0% |
| blazediff/2b.png | 0.4 | 1.3 MB | 1.3 MB | 1.3 MB | 1.3 MB | 99.8% | 99.8% | 100.0% |
| blazediff/3a.png | 1.6 | 6.2 MB | 6.2 MB | 6.2 MB | 6.2 MB | 99.8% | 99.8% | 100.0% |
| blazediff/3b.png | 1.6 | 6.2 MB | 6.2 MB | 6.2 MB | 6.2 MB | 99.8% | 99.8% | 100.0% |
| blazediff/4a.png | 3.8 | 14.4 MB | 14.5 MB | 14.4 MB | 14.5 MB | 99.8% | 99.8% | 100.0% |
| blazediff/4b.png | 3.8 | 14.4 MB | 14.5 MB | 14.4 MB | 14.5 MB | 99.8% | 99.8% | 100.0% |
| page/1a.png | 58.9 | 224.9 MB | 225.2 MB | 224.9 MB | 225.2 MB | 99.8% | 99.8% | 100.0% |
| page/1b.png | 58.9 | 224.9 MB | 225.2 MB | 224.9 MB | 225.2 MB | 99.8% | 99.8% | 100.0% |
| page/2a.png | 41.7 | 159.1 MB | 159.4 MB | 159.1 MB | 159.4 MB | 99.8% | 99.8% | 100.0% |
| page/2b.png | 41.7 | 159.1 MB | 159.4 MB | 159.1 MB | 159.4 MB | 99.8% | 99.8% | 100.0% |
| pixelmatch/1a.png | 0.1 | 512.4 KB | 513.1 KB | 512.4 KB | 513.1 KB | 99.8% | 99.8% | 100.0% |
| pixelmatch/1b.png | 0.1 | 512.4 KB | 513.1 KB | 512.4 KB | 513.1 KB | 99.8% | 99.8% | 100.0% |
| pixelmatch/2a.png | 0.1 | 256.3 KB | 256.7 KB | 256.3 KB | 256.7 KB | 99.8% | 99.8% | 100.0% |
| pixelmatch/2b.png | 0.1 | 256.3 KB | 256.7 KB | 256.3 KB | 256.7 KB | 99.8% | 99.8% | 100.0% |
| pixelmatch/3a.png | 0.1 | 512.4 KB | 513.1 KB | 512.4 KB | 513.1 KB | 99.8% | 99.8% | 100.0% |
| pixelmatch/3b.png | 0.1 | 512.4 KB | 513.1 KB | 512.4 KB | 513.1 KB | 99.8% | 99.8% | 100.0% |
| pixelmatch/4a.png | 0.2 | 705.4 KB | 706.5 KB | 705.4 KB | 706.5 KB | 99.8% | 99.8% | 100.0% |
| pixelmatch/4b.png | 0.2 | 705.4 KB | 706.5 KB | 705.4 KB | 706.5 KB | 99.8% | 99.8% | 100.0% |
| pixelmatch/5a.png | 0.1 | 256.3 KB | 256.7 KB | 256.3 KB | 256.7 KB | 99.8% | 99.8% | 100.0% |
| pixelmatch/5b.png | 0.1 | 256.3 KB | 256.7 KB | 256.3 KB | 256.7 KB | 99.8% | 99.8% | 100.0% |
| pixelmatch/6a.png | 0.1 | 256.3 KB | 256.7 KB | 256.3 KB | 256.7 KB | 99.8% | 99.8% | 100.0% |
| pixelmatch/6b.png | 0.1 | 256.3 KB | 256.7 KB | 256.3 KB | 256.7 KB | 99.8% | 99.8% | 100.0% |
| pixelmatch/7a.png | 0.3 | 977.2 KB | 978.7 KB | 977.2 KB | 978.6 KB | 99.8% | 99.8% | 100.0% |
| pixelmatch/7b.png | 0.3 | 977.2 KB | 978.7 KB | 977.2 KB | 978.6 KB | 99.8% | 99.8% | 100.0% |
| same/1a.png | 1.7 | 6.6 MB | 6.6 MB | 6.6 MB | 6.6 MB | 99.8% | 99.8% | 100.0% |
| same/1b.png | 1.7 | 6.6 MB | 6.6 MB | 6.6 MB | 6.6 MB | 99.8% | 99.8% | 100.0% |
| TOTAL | 1.28 GB | 1.28 GB | 1.28 GB | 1.28 GB | 99.8% | 99.8% | 100.0% |
Encode size, half compression
TOTAL OUTPUT SIZE Β· 36 FIXTURES
Levels: blazediff libdeflate 6 Β· spng zlib 4 Β· image-rs flate2 4 Β· zune stored.
Apple M1 Max Β· darwin/arm64 Β· Node v22.14.0 Β· rustc 1.97.1 (8bab26f4f 2026-07-14) Β· best-of, iterations scaled by image size, single-threaded Β· 2026-10-22 Β· 234b300-dirty Β· pnpm benchmark png
Per-fixture results (36)
| Fixture | MPx | blazediff | spng | image-rs | zune | blazediff vs spng | image-rs vs spng | zune vs spng |
|---|---|---|---|---|---|---|---|---|
| 4k/1a.png | 17.9 | 20.6 MB | 21.3 MB | 21.5 MB | 68.5 MB | 96.6% | 100.9% | 320.8% |
| 4k/1b.png | 17.9 | 17.2 MB | 18.2 MB | 17.9 MB | 68.5 MB | 94.5% | 98.2% | 375.4% |
| 4k/2a.png | 20.0 | 26.1 MB | 27.1 MB | 26.6 MB | 76.3 MB | 96.2% | 98.3% | 281.7% |
| 4k/2b.png | 20.0 | 26.6 MB | 27.6 MB | 27.2 MB | 76.3 MB | 96.6% | 98.6% | 276.8% |
| 4k/3a.png | 24.0 | 32.1 MB | 35.0 MB | 33.1 MB | 91.7 MB | 91.7% | 94.7% | 262.2% |
| 4k/3b.png | 24.0 | 31.6 MB | 34.5 MB | 32.6 MB | 91.7 MB | 91.5% | 94.4% | 265.5% |
| alpha/1a.png | 0.0 | 2.8 KB | 2.9 KB | 3.0 KB | 144.5 KB | 95.3% | 100.3% | 4908.5% |
| alpha/1b.png | 0.0 | 2.8 KB | 3.0 KB | 3.0 KB | 144.5 KB | 95.2% | 99.9% | 4826.8% |
| blazediff/1a.png | 0.4 | 30.8 KB | 35.4 KB | 30.2 KB | 1.6 MB | 86.9% | 85.4% | 4770.7% |
| blazediff/1b.png | 0.4 | 30.9 KB | 35.4 KB | 30.3 KB | 1.6 MB | 87.1% | 85.4% | 4765.8% |
| blazediff/2a.png | 0.4 | 31.5 KB | 38.1 KB | 30.1 KB | 1.3 MB | 82.6% | 79.2% | 3610.7% |
| blazediff/2b.png | 0.4 | 32.8 KB | 39.8 KB | 31.5 KB | 1.3 MB | 82.3% | 79.2% | 3449.9% |
| blazediff/3a.png | 1.6 | 815.5 KB | 877.0 KB | 835.0 KB | 6.2 MB | 93.0% | 95.2% | 727.6% |
| blazediff/3b.png | 1.6 | 792.2 KB | 853.3 KB | 812.1 KB | 6.2 MB | 92.8% | 95.2% | 747.8% |
| blazediff/4a.png | 3.8 | 98.7 KB | 114.0 KB | 100.5 KB | 14.5 MB | 86.6% | 88.2% | 12998.3% |
| blazediff/4b.png | 3.8 | 98.3 KB | 114.1 KB | 100.4 KB | 14.5 MB | 86.1% | 88.0% | 12985.2% |
| page/1a.png | 58.9 | 11.1 MB | 12.0 MB | 11.1 MB | 225.2 MB | 92.5% | 92.5% | 1884.8% |
| page/1b.png | 58.9 | 11.0 MB | 11.9 MB | 11.0 MB | 225.2 MB | 92.5% | 92.5% | 1886.3% |
| page/2a.png | 41.7 | 10.3 MB | 11.0 MB | 10.4 MB | 159.4 MB | 93.9% | 94.6% | 1446.2% |
| page/2b.png | 41.7 | 10.4 MB | 11.0 MB | 10.5 MB | 159.4 MB | 94.0% | 94.8% | 1445.4% |
| pixelmatch/1a.png | 0.1 | 31.8 KB | 32.2 KB | 33.4 KB | 513.1 KB | 98.9% | 103.6% | 1593.4% |
| pixelmatch/1b.png | 0.1 | 31.9 KB | 32.2 KB | 33.4 KB | 513.1 KB | 98.9% | 103.5% | 1591.6% |
| pixelmatch/2a.png | 0.1 | 90.8 KB | 96.9 KB | 91.0 KB | 256.7 KB | 93.8% | 93.9% | 265.0% |
| pixelmatch/2b.png | 0.1 | 94.4 KB | 99.9 KB | 94.3 KB | 256.7 KB | 94.4% | 94.3% | 257.0% |
| pixelmatch/3a.png | 0.1 | 13.9 KB | 14.7 KB | 13.8 KB | 513.1 KB | 94.6% | 94.2% | 3497.0% |
| pixelmatch/3b.png | 0.1 | 13.7 KB | 14.3 KB | 13.5 KB | 513.1 KB | 95.7% | 94.5% | 3593.6% |
| pixelmatch/4a.png | 0.2 | 240.1 KB | 254.1 KB | 241.3 KB | 706.5 KB | 94.5% | 95.0% | 278.0% |
| pixelmatch/4b.png | 0.2 | 251.0 KB | 268.1 KB | 251.9 KB | 706.5 KB | 93.6% | 94.0% | 263.5% |
| pixelmatch/5a.png | 0.1 | 3.0 KB | 3.3 KB | 3.1 KB | 256.7 KB | 91.4% | 92.3% | 7693.1% |
| pixelmatch/5b.png | 0.1 | 3.2 KB | 3.3 KB | 3.2 KB | 256.7 KB | 98.5% | 98.4% | 7793.4% |
| pixelmatch/6a.png | 0.1 | 44.4 KB | 50.7 KB | 48.5 KB | 256.7 KB | 87.6% | 95.6% | 506.4% |
| pixelmatch/6b.png | 0.1 | 32.0 KB | 37.9 KB | 36.5 KB | 256.7 KB | 84.6% | 96.4% | 678.0% |
| pixelmatch/7a.png | 0.3 | 88.2 KB | 96.1 KB | 87.4 KB | 978.6 KB | 91.8% | 91.0% | 1018.8% |
| pixelmatch/7b.png | 0.3 | 87.3 KB | 94.8 KB | 86.5 KB | 978.6 KB | 92.1% | 91.2% | 1032.4% |
| same/1a.png | 1.7 | 124.9 KB | 140.3 KB | 126.7 KB | 6.6 MB | 89.1% | 90.3% | 4847.0% |
| same/1b.png | 1.7 | 124.9 KB | 140.3 KB | 126.7 KB | 6.6 MB | 89.1% | 90.3% | 4847.0% |
| TOTAL | 200.2 MB | 213.1 MB | 205.1 MB | 1.28 GB | 93.9% | 96.3% | 614.8% |
WebAssembly with SIMD, running in Node:
WebAssembly decode (PNG to RGBA8)
TOTAL TIME, BEST-OF Β· 36 FIXTURES Β· IO EXCLUDED
Apple M1 Max Β· darwin/arm64 Β· Node v22.14.0 Β· rustc 1.97.1 (8bab26f4f 2026-07-14) Β· best-of, iterations scaled by image size, single-threaded, Node (V8) running wasm32 with SIMD Β· 2026-10-26 Β· 3017cb8-dirty Β· pnpm benchmark png-wasm
Per-fixture results (36)
| Fixture | MPx | blazediff | zune-png | jSquash | blazediff vs jSquash | zune-png vs jSquash |
|---|---|---|---|---|---|---|
| 4k/1a.png | 17.9 | 185ms | 223ms | 398ms | 2.15x | 1.78x |
| 4k/1b.png | 17.9 | 163ms | 206ms | 378ms | 2.31x | 1.84x |
| 4k/2a.png | 20.0 | 224ms | 274ms | 545ms | 2.44x | 1.99x |
| 4k/2b.png | 20.0 | 232ms | 269ms | 547ms | 2.36x | 2.03x |
| 4k/3a.png | 24.0 | 245ms | 310ms | 569ms | 2.32x | 1.83x |
| 4k/3b.png | 24.0 | 242ms | 309ms | 579ms | 2.39x | 1.87x |
| alpha/1a.png | 0.0 | 0.10ms | 0.12ms | 0.36ms | 3.47x | 3.13x |
| alpha/1b.png | 0.0 | 0.11ms | 0.11ms | 0.36ms | 3.32x | 3.17x |
| blazediff/1a.png | 0.4 | 0.85ms | 0.97ms | 4.32ms | 5.09x | 4.45x |
| blazediff/1b.png | 0.4 | 0.80ms | 1.00ms | 4.35ms | 5.47x | 4.34x |
| blazediff/2a.png | 0.4 | 0.74ms | 0.88ms | 3.66ms | 4.92x | 4.14x |
| blazediff/2b.png | 0.4 | 0.80ms | 0.97ms | 3.71ms | 4.67x | 3.84x |
| blazediff/3a.png | 1.6 | 13.48ms | 16.19ms | 36.66ms | 2.72x | 2.26x |
| blazediff/3b.png | 1.6 | 13.52ms | 16.08ms | 35.38ms | 2.62x | 2.20x |
| blazediff/4a.png | 3.8 | 4.40ms | 4.74ms | 31.96ms | 7.26x | 6.74x |
| blazediff/4b.png | 3.8 | 4.51ms | 4.78ms | 31.67ms | 7.02x | 6.63x |
| page/1a.png | 58.9 | 210ms | 277ms | 626ms | 2.97x | 2.25x |
| page/1b.png | 58.9 | 217ms | 262ms | 610ms | 2.80x | 2.33x |
| page/2a.png | 41.7 | 47.61ms | 53.70ms | 286ms | 6.01x | 5.33x |
| page/2b.png | 41.7 | 46.96ms | 51.86ms | 283ms | 6.02x | 5.45x |
| pixelmatch/1a.png | 0.1 | 0.77ms | 0.94ms | 1.82ms | 2.36x | 1.94x |
| pixelmatch/1b.png | 0.1 | 0.61ms | 0.81ms | 1.81ms | 2.98x | 2.24x |
| pixelmatch/2a.png | 0.1 | 0.20ms | 0.23ms | 0.77ms | 3.83x | 3.36x |
| pixelmatch/2b.png | 0.1 | 0.21ms | 0.23ms | 0.78ms | 3.76x | 3.31x |
| pixelmatch/3a.png | 0.1 | 0.58ms | 0.67ms | 1.52ms | 2.60x | 2.26x |
| pixelmatch/3b.png | 0.1 | 0.55ms | 0.67ms | 1.52ms | 2.76x | 2.28x |
| pixelmatch/4a.png | 0.2 | 1.78ms | 2.21ms | 4.31ms | 2.42x | 1.95x |
| pixelmatch/4b.png | 0.2 | 1.99ms | 2.37ms | 4.68ms | 2.35x | 1.97x |
| pixelmatch/5a.png | 0.1 | 0.56ms | 0.59ms | 1.03ms | 1.84x | 1.75x |
| pixelmatch/5b.png | 0.1 | 0.56ms | 0.55ms | 0.75ms | 1.33x | 1.36x |
| pixelmatch/6a.png | 0.1 | 0.68ms | 0.67ms | 1.32ms | 1.93x | 1.95x |
| pixelmatch/6b.png | 0.1 | 0.90ms | 0.99ms | 1.37ms | 1.53x | 1.39x |
| pixelmatch/7a.png | 0.3 | 0.34ms | 0.39ms | 1.90ms | 5.52x | 4.88x |
| pixelmatch/7b.png | 0.3 | 0.34ms | 0.41ms | 1.88ms | 5.48x | 4.58x |
| same/1a.png | 1.7 | 3.54ms | 7.37ms | 14.08ms | 3.98x | 1.91x |
| same/1b.png | 1.7 | 3.56ms | 7.43ms | 14.03ms | 3.95x | 1.89x |
| TOTAL | 1.87s | 2.31s | 5.03s | 2.69x | 2.18x |
WebAssembly encode, no compression
TOTAL TIME, BEST-OF Β· 36 FIXTURES Β· IO EXCLUDED
Levels: blazediff stored Β· zune-png stored.
Apple M1 Max Β· darwin/arm64 Β· Node v22.14.0 Β· rustc 1.97.1 (8bab26f4f 2026-07-14) Β· best-of, iterations scaled by image size, single-threaded, Node (V8) running wasm32 with SIMD Β· 2026-10-26 Β· 3017cb8-dirty Β· pnpm benchmark png-wasm
Per-fixture results (36)
| Fixture | MPx | blazediff | zune-png | blazediff vs zune-png |
|---|---|---|---|---|
| 4k/1a.png | 17.9 | 44.55ms | 71.50ms | 1.61x |
| 4k/1b.png | 17.9 | 37.01ms | 66.31ms | 1.79x |
| 4k/2a.png | 20.0 | 51.72ms | 81.47ms | 1.58x |
| 4k/2b.png | 20.0 | 42.54ms | 74.70ms | 1.76x |
| 4k/3a.png | 24.0 | 52.96ms | 91.61ms | 1.73x |
| 4k/3b.png | 24.0 | 50.30ms | 94.01ms | 1.87x |
| alpha/1a.png | 0.0 | 0.09ms | 0.14ms | 1.60x |
| alpha/1b.png | 0.0 | 0.09ms | 0.14ms | 1.57x |
| blazediff/1a.png | 0.4 | 0.94ms | 1.50ms | 1.59x |
| blazediff/1b.png | 0.4 | 0.91ms | 1.50ms | 1.64x |
| blazediff/2a.png | 0.4 | 0.75ms | 1.19ms | 1.59x |
| blazediff/2b.png | 0.4 | 0.77ms | 1.22ms | 1.59x |
| blazediff/3a.png | 1.6 | 3.35ms | 6.20ms | 1.85x |
| blazediff/3b.png | 1.6 | 3.42ms | 5.85ms | 1.71x |
| blazediff/4a.png | 3.8 | 7.90ms | 13.80ms | 1.75x |
| blazediff/4b.png | 3.8 | 7.97ms | 13.63ms | 1.71x |
| page/1a.png | 58.9 | 129ms | 258ms | 1.99x |
| page/1b.png | 58.9 | 131ms | 264ms | 2.01x |
| page/2a.png | 41.7 | 89.78ms | 153ms | 1.71x |
| page/2b.png | 41.7 | 88.88ms | 156ms | 1.76x |
| pixelmatch/1a.png | 0.1 | 0.28ms | 0.45ms | 1.62x |
| pixelmatch/1b.png | 0.1 | 0.28ms | 0.47ms | 1.64x |
| pixelmatch/2a.png | 0.1 | 0.14ms | 0.24ms | 1.66x |
| pixelmatch/2b.png | 0.1 | 0.14ms | 0.23ms | 1.60x |
| pixelmatch/3a.png | 0.1 | 0.28ms | 0.45ms | 1.59x |
| pixelmatch/3b.png | 0.1 | 0.27ms | 0.46ms | 1.66x |
| pixelmatch/4a.png | 0.2 | 0.38ms | 0.61ms | 1.62x |
| pixelmatch/4b.png | 0.2 | 0.39ms | 0.63ms | 1.63x |
| pixelmatch/5a.png | 0.1 | 0.14ms | 0.24ms | 1.63x |
| pixelmatch/5b.png | 0.1 | 0.14ms | 0.23ms | 1.61x |
| pixelmatch/6a.png | 0.1 | 0.14ms | 0.22ms | 1.60x |
| pixelmatch/6b.png | 0.1 | 0.14ms | 0.22ms | 1.62x |
| pixelmatch/7a.png | 0.3 | 0.52ms | 0.85ms | 1.64x |
| pixelmatch/7b.png | 0.3 | 0.52ms | 0.86ms | 1.68x |
| same/1a.png | 1.7 | 3.58ms | 6.16ms | 1.72x |
| same/1b.png | 1.7 | 3.60ms | 6.16ms | 1.71x |
| TOTAL | 756ms | 1.37s | 1.82x |
WebAssembly encode, default settings
TOTAL TIME, BEST-OF Β· 36 FIXTURES Β· IO EXCLUDED
Levels: blazediff fdeflate, adaptive filter Β· zune-png stored Β· jSquash png crate default.
Apple M1 Max Β· darwin/arm64 Β· Node v22.14.0 Β· rustc 1.97.1 (8bab26f4f 2026-07-14) Β· best-of, iterations scaled by image size, single-threaded, Node (V8) running wasm32 with SIMD Β· 2026-10-26 Β· 3017cb8-dirty Β· pnpm benchmark png-wasm
Per-fixture results (36)
| Fixture | MPx | blazediff | zune-png | jSquash | blazediff vs jSquash | zune-png vs jSquash |
|---|---|---|---|---|---|---|
| 4k/1a.png | 17.9 | 236ms | 65.81ms | 286ms | 1.21x | 4.35x |
| 4k/1b.png | 17.9 | 225ms | 70.29ms | 276ms | 1.22x | 3.92x |
| 4k/2a.png | 20.0 | 234ms | 73.03ms | 308ms | 1.32x | 4.22x |
| 4k/2b.png | 20.0 | 240ms | 74.41ms | 303ms | 1.26x | 4.07x |
| 4k/3a.png | 24.0 | 304ms | 87.89ms | 384ms | 1.26x | 4.37x |
| 4k/3b.png | 24.0 | 304ms | 89.58ms | 388ms | 1.28x | 4.33x |
| alpha/1a.png | 0.0 | 0.16ms | 0.14ms | 0.23ms | 1.39x | 1.59x |
| alpha/1b.png | 0.0 | 0.16ms | 0.14ms | 0.23ms | 1.38x | 1.56x |
| blazediff/1a.png | 0.4 | 3.48ms | 1.50ms | 3.17ms | 0.91x | 2.11x |
| blazediff/1b.png | 0.4 | 3.44ms | 1.52ms | 3.18ms | 0.92x | 2.10x |
| blazediff/2a.png | 0.4 | 1.38ms | 1.20ms | 2.12ms | 1.53x | 1.76x |
| blazediff/2b.png | 0.4 | 1.40ms | 1.19ms | 2.14ms | 1.53x | 1.79x |
| blazediff/3a.png | 1.6 | 17.94ms | 6.10ms | 18.34ms | 1.02x | 3.00x |
| blazediff/3b.png | 1.6 | 17.72ms | 5.82ms | 17.91ms | 1.01x | 3.08x |
| blazediff/4a.png | 3.8 | 23.73ms | 13.54ms | 19.57ms | 0.82x | 1.44x |
| blazediff/4b.png | 3.8 | 23.81ms | 13.54ms | 19.55ms | 0.82x | 1.44x |
| page/1a.png | 58.9 | 485ms | 233ms | 413ms | 0.85x | 1.77x |
| page/1b.png | 58.9 | 480ms | 234ms | 404ms | 0.84x | 1.72x |
| page/2a.png | 41.7 | 207ms | 157ms | 323ms | 1.56x | 2.05x |
| page/2b.png | 41.7 | 191ms | 156ms | 321ms | 1.68x | 2.06x |
| pixelmatch/1a.png | 0.1 | 1.14ms | 0.44ms | 0.93ms | 0.82x | 2.10x |
| pixelmatch/1b.png | 0.1 | 1.19ms | 0.47ms | 0.96ms | 0.81x | 2.05x |
| pixelmatch/2a.png | 0.1 | 0.50ms | 0.24ms | 0.91ms | 1.83x | 3.87x |
| pixelmatch/2b.png | 0.1 | 0.49ms | 0.23ms | 0.89ms | 1.82x | 3.92x |
| pixelmatch/3a.png | 0.1 | 1.12ms | 0.45ms | 0.81ms | 0.73x | 1.79x |
| pixelmatch/3b.png | 0.1 | 1.12ms | 0.46ms | 0.82ms | 0.73x | 1.78x |
| pixelmatch/4a.png | 0.2 | 2.28ms | 0.62ms | 2.62ms | 1.15x | 4.26x |
| pixelmatch/4b.png | 0.2 | 2.28ms | 0.64ms | 2.75ms | 1.21x | 4.26x |
| pixelmatch/5a.png | 0.1 | 0.60ms | 0.24ms | 0.52ms | 0.87x | 2.19x |
| pixelmatch/5b.png | 0.1 | 0.57ms | 0.23ms | 0.52ms | 0.90x | 2.28x |
| pixelmatch/6a.png | 0.1 | 0.80ms | 0.22ms | 0.80ms | 1.00x | 3.59x |
| pixelmatch/6b.png | 0.1 | 0.79ms | 0.22ms | 0.74ms | 0.94x | 3.30x |
| pixelmatch/7a.png | 0.3 | 1.25ms | 0.85ms | 2.04ms | 1.63x | 2.41x |
| pixelmatch/7b.png | 0.3 | 1.22ms | 0.86ms | 2.06ms | 1.69x | 2.40x |
| same/1a.png | 1.7 | 12.78ms | 6.16ms | 10.73ms | 0.84x | 1.74x |
| same/1b.png | 1.7 | 12.82ms | 6.16ms | 10.69ms | 0.83x | 1.74x |
| TOTAL | 3.04s | 1.30s | 3.53s | 1.16x | 2.71x |
WebAssembly encode size, no compression
TOTAL OUTPUT SIZE Β· 36 FIXTURES
Levels: blazediff stored Β· zune-png stored.
Apple M1 Max Β· darwin/arm64 Β· Node v22.14.0 Β· rustc 1.97.1 (8bab26f4f 2026-07-14) Β· best-of, iterations scaled by image size, single-threaded, Node (V8) running wasm32 with SIMD Β· 2026-10-26 Β· 3017cb8-dirty Β· pnpm benchmark png-wasm
Per-fixture results (36)
| Fixture | MPx | blazediff | zune-png | blazediff vs zune-png |
|---|---|---|---|---|
| 4k/1a.png | 17.9 | 68.4 MB | 68.5 MB | 99.9% |
| 4k/1b.png | 17.9 | 68.4 MB | 68.5 MB | 99.9% |
| 4k/2a.png | 20.0 | 76.2 MB | 76.3 MB | 99.9% |
| 4k/2b.png | 20.0 | 76.2 MB | 76.3 MB | 99.9% |
| 4k/3a.png | 24.0 | 91.6 MB | 91.7 MB | 99.9% |
| 4k/3b.png | 24.0 | 91.6 MB | 91.7 MB | 99.9% |
| alpha/1a.png | 0.0 | 144.3 KB | 144.5 KB | 99.9% |
| alpha/1b.png | 0.0 | 144.3 KB | 144.5 KB | 99.9% |
| blazediff/1a.png | 0.4 | 1.6 MB | 1.6 MB | 99.9% |
| blazediff/1b.png | 0.4 | 1.6 MB | 1.6 MB | 99.9% |
| blazediff/2a.png | 0.4 | 1.3 MB | 1.3 MB | 99.9% |
| blazediff/2b.png | 0.4 | 1.3 MB | 1.3 MB | 99.9% |
| blazediff/3a.png | 1.6 | 6.2 MB | 6.2 MB | 99.9% |
| blazediff/3b.png | 1.6 | 6.2 MB | 6.2 MB | 99.9% |
| blazediff/4a.png | 3.8 | 14.4 MB | 14.5 MB | 99.9% |
| blazediff/4b.png | 3.8 | 14.4 MB | 14.5 MB | 99.9% |
| page/1a.png | 58.9 | 224.9 MB | 225.2 MB | 99.9% |
| page/1b.png | 58.9 | 224.9 MB | 225.2 MB | 99.9% |
| page/2a.png | 41.7 | 159.1 MB | 159.4 MB | 99.9% |
| page/2b.png | 41.7 | 159.1 MB | 159.4 MB | 99.9% |
| pixelmatch/1a.png | 0.1 | 512.4 KB | 513.1 KB | 99.9% |
| pixelmatch/1b.png | 0.1 | 512.4 KB | 513.1 KB | 99.9% |
| pixelmatch/2a.png | 0.1 | 256.3 KB | 256.7 KB | 99.9% |
| pixelmatch/2b.png | 0.1 | 256.3 KB | 256.7 KB | 99.9% |
| pixelmatch/3a.png | 0.1 | 512.4 KB | 513.1 KB | 99.9% |
| pixelmatch/3b.png | 0.1 | 512.4 KB | 513.1 KB | 99.9% |
| pixelmatch/4a.png | 0.2 | 705.4 KB | 706.5 KB | 99.9% |
| pixelmatch/4b.png | 0.2 | 705.4 KB | 706.5 KB | 99.9% |
| pixelmatch/5a.png | 0.1 | 256.3 KB | 256.7 KB | 99.9% |
| pixelmatch/5b.png | 0.1 | 256.3 KB | 256.7 KB | 99.9% |
| pixelmatch/6a.png | 0.1 | 256.3 KB | 256.7 KB | 99.9% |
| pixelmatch/6b.png | 0.1 | 256.3 KB | 256.7 KB | 99.9% |
| pixelmatch/7a.png | 0.3 | 977.2 KB | 978.6 KB | 99.9% |
| pixelmatch/7b.png | 0.3 | 977.2 KB | 978.6 KB | 99.9% |
| same/1a.png | 1.7 | 6.6 MB | 6.6 MB | 99.9% |
| same/1b.png | 1.7 | 6.6 MB | 6.6 MB | 99.9% |
| TOTAL | 1.28 GB | 1.28 GB | 99.9% |
WebAssembly encode size, default settings
TOTAL OUTPUT SIZE Β· 36 FIXTURES
Levels: blazediff fdeflate, adaptive filter Β· zune-png stored Β· jSquash png crate default.
Apple M1 Max Β· darwin/arm64 Β· Node v22.14.0 Β· rustc 1.97.1 (8bab26f4f 2026-07-14) Β· best-of, iterations scaled by image size, single-threaded, Node (V8) running wasm32 with SIMD Β· 2026-10-26 Β· 3017cb8-dirty Β· pnpm benchmark png-wasm
Per-fixture results (36)
| Fixture | MPx | blazediff | zune-png | jSquash | blazediff vs jSquash | zune-png vs jSquash |
|---|---|---|---|---|---|---|
| 4k/1a.png | 17.9 | 19.9 MB | 68.5 MB | 25.8 MB | 76.9% | 265.1% |
| 4k/1b.png | 17.9 | 18.4 MB | 68.5 MB | 24.5 MB | 74.9% | 278.9% |
| 4k/2a.png | 20.0 | 28.0 MB | 76.3 MB | 37.1 MB | 75.5% | 205.4% |
| 4k/2b.png | 20.0 | 28.1 MB | 76.3 MB | 37.1 MB | 75.5% | 205.3% |
| 4k/3a.png | 24.0 | 35.5 MB | 91.7 MB | 43.2 MB | 82.1% | 212.3% |
| 4k/3b.png | 24.0 | 35.1 MB | 91.7 MB | 42.8 MB | 82.0% | 214.5% |
| alpha/1a.png | 0.0 | 2.3 KB | 144.5 KB | 4.5 KB | 51.1% | 3235.1% |
| alpha/1b.png | 0.0 | 2.2 KB | 144.5 KB | 4.5 KB | 49.5% | 3187.0% |
| blazediff/1a.png | 0.4 | 67.9 KB | 1.6 MB | 152.5 KB | 44.5% | 1107.5% |
| blazediff/1b.png | 0.4 | 68.1 KB | 1.6 MB | 152.8 KB | 44.5% | 1105.5% |
| blazediff/2a.png | 0.4 | 19.6 KB | 1.3 MB | 77.8 KB | 25.2% | 1766.4% |
| blazediff/2b.png | 0.4 | 20.2 KB | 1.3 MB | 79.9 KB | 25.3% | 1720.1% |
| blazediff/3a.png | 1.6 | 996.6 KB | 6.2 MB | 1.2 MB | 79.2% | 507.3% |
| blazediff/3b.png | 1.6 | 978.8 KB | 6.2 MB | 1.2 MB | 79.0% | 515.2% |
| blazediff/4a.png | 3.8 | 307.2 KB | 14.5 MB | 232.3 KB | 132.2% | 6376.4% |
| blazediff/4b.png | 3.8 | 328.9 KB | 14.5 MB | 236.9 KB | 138.8% | 6254.4% |
| page/1a.png | 58.9 | 12.4 MB | 225.2 MB | 16.7 MB | 74.3% | 1349.0% |
| page/1b.png | 58.9 | 12.4 MB | 225.2 MB | 16.7 MB | 74.3% | 1350.0% |
| page/2a.png | 41.7 | 6.5 MB | 159.4 MB | 16.8 MB | 38.5% | 945.9% |
| page/2b.png | 41.7 | 6.5 MB | 159.4 MB | 16.9 MB | 38.4% | 944.9% |
| pixelmatch/1a.png | 0.1 | 37.0 KB | 513.1 KB | 40.0 KB | 92.5% | 1282.6% |
| pixelmatch/1b.png | 0.1 | 36.9 KB | 513.1 KB | 40.0 KB | 92.4% | 1283.7% |
| pixelmatch/2a.png | 0.1 | 44.9 KB | 256.7 KB | 122.3 KB | 36.7% | 209.9% |
| pixelmatch/2b.png | 0.1 | 46.0 KB | 256.7 KB | 124.7 KB | 36.9% | 205.9% |
| pixelmatch/3a.png | 0.1 | 27.8 KB | 513.1 KB | 33.6 KB | 82.8% | 1527.2% |
| pixelmatch/3b.png | 0.1 | 27.9 KB | 513.1 KB | 33.7 KB | 82.8% | 1521.9% |
| pixelmatch/4a.png | 0.2 | 280.8 KB | 706.5 KB | 317.8 KB | 88.4% | 222.3% |
| pixelmatch/4b.png | 0.2 | 299.9 KB | 706.5 KB | 338.2 KB | 88.7% | 208.9% |
| pixelmatch/5a.png | 0.1 | 14.6 KB | 256.7 KB | 43.5 KB | 33.5% | 589.8% |
| pixelmatch/5b.png | 0.1 | 13.9 KB | 256.7 KB | 42.6 KB | 32.6% | 602.1% |
| pixelmatch/6a.png | 0.1 | 82.7 KB | 256.7 KB | 105.0 KB | 78.7% | 244.5% |
| pixelmatch/6b.png | 0.1 | 65.5 KB | 256.7 KB | 87.5 KB | 74.9% | 293.4% |
| pixelmatch/7a.png | 0.3 | 51.2 KB | 978.6 KB | 144.8 KB | 35.4% | 675.9% |
| pixelmatch/7b.png | 0.3 | 50.5 KB | 978.6 KB | 143.2 KB | 35.3% | 683.6% |
| same/1a.png | 1.7 | 206.3 KB | 6.6 MB | 306.2 KB | 67.4% | 2220.8% |
| same/1b.png | 1.7 | 206.3 KB | 6.6 MB | 306.2 KB | 67.4% | 2220.8% |
| TOTAL | 206.8 MB | 1.28 GB | 283.2 MB | 73.0% | 462.5% |
zune-png is fastest in the compressed-encode charts because its output is stored, not compressed: it is the same size as its uncompressed output. Read the size charts next to the time charts.
Switching
In Rust:
use blazediff_png::decode;
let image = decode(&std::fs::read("image.png")?)?; // RGBA8: Image { data, width, height }In a browser, an edge runtime or Node:
import { decode, encode } from "@blazediff/codec-png-wasm";
const image = await decode(bytes); // { data, width, height }, RGBA8
const png = await encode(image, { compression: 4 });When to keep zune-png
- You need
no_std, or APNG frame compositing. - You already decode other formats with zune-image.
- You want a pure-Rust decoder and do not need libspng parity.