Skip to Content
New: codec-png-native and codec-png-wasm bring the blazediff-png codec to Node and WebAssembly, faster than spng and jSquash. Read more β†’
Comparevs zune-png

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-pngBlazeDiff (blazediff-png)
LicenseMIT OR Apache-2.0 OR ZlibMIT
LanguageRust, unsafe only for SIMDRust with SIMD kernels; C zlib and libdeflate by default
no_stdYesNo
APNGYes, with frame compositingNo
EncodeStored data in these benchmarksStored, or libdeflate levels 1 to 12 (fdeflate in wasm)
WebAssemblyBuild it yourself (zune-wasm on npm is from 2024)@blazediff/codec-png-wasm, about 150 KB with SIMD
Parity referenceCross-checked against the png crateByte-identical to libspng

Benchmarks

Native Rust, single-threaded, decode to RGBA8:

Decode (PNG to RGBA8)

TOTAL TIME, BEST-OF Β· 36 FIXTURES Β· IO EXCLUDED

BlazeDiffOther librariesLower is better

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)
FixtureMPxblazediffspngimage-rszuneblazediff vs spngimage-rs vs spngzune vs spng
4k/1a.png17.9138ms179ms152ms209ms1.30x1.18x0.86x
4k/1b.png17.9125ms187ms145ms196ms1.50x1.29x0.95x
4k/2a.png20.0158ms279ms194ms234ms1.76x1.44x1.19x
4k/2b.png20.0160ms221ms196ms235ms1.39x1.13x0.94x
4k/3a.png24.0160ms220ms194ms265ms1.38x1.14x0.83x
4k/3b.png24.0160ms220ms200ms266ms1.37x1.10x0.83x
alpha/1a.png0.00.08ms0.20ms0.07ms0.11ms2.37x2.64x1.76x
alpha/1b.png0.00.09ms0.20ms0.08ms0.11ms2.31x2.57x1.73x
blazediff/1a.png0.40.60ms0.69ms0.71ms1.01ms1.14x0.97x0.68x
blazediff/1b.png0.40.60ms0.70ms0.71ms1.01ms1.15x0.98x0.69x
blazediff/2a.png0.40.62ms0.83ms0.69ms0.93ms1.36x1.21x0.90x
blazediff/2b.png0.40.66ms0.85ms0.73ms1.02ms1.30x1.17x0.84x
blazediff/3a.png1.610.86ms13.38ms12.10ms17.55ms1.23x1.11x0.76x
blazediff/3b.png1.610.83ms13.25ms12.12ms17.45ms1.22x1.09x0.76x
blazediff/4a.png3.82.80ms3.41ms3.38ms4.43ms1.22x1.01x0.77x
blazediff/4b.png3.82.93ms3.48ms3.42ms4.49ms1.19x1.02x0.78x
page/1a.png58.9156ms236ms184ms255ms1.52x1.28x0.93x
page/1b.png58.9156ms234ms184ms246ms1.50x1.28x0.95x
page/2a.png41.726.12ms36.51ms20.21ms47.56ms1.40x1.81x0.77x
page/2b.png41.726.46ms35.71ms20.65ms58.02ms1.35x1.73x0.62x
pixelmatch/1a.png0.10.74ms0.95ms0.67ms1.07ms1.28x1.42x0.89x
pixelmatch/1b.png0.10.55ms0.71ms0.53ms0.89ms1.30x1.35x0.80x
pixelmatch/2a.png0.10.11ms0.37ms0.12ms0.15ms3.32x3.03x2.41x
pixelmatch/2b.png0.10.11ms0.38ms0.12ms0.15ms3.34x3.18x2.43x
pixelmatch/3a.png0.10.50ms0.73ms0.47ms0.74ms1.46x1.57x0.98x
pixelmatch/3b.png0.10.50ms0.72ms0.46ms0.74ms1.45x1.56x0.97x
pixelmatch/4a.png0.21.08ms1.83ms1.36ms1.74ms1.69x1.35x1.06x
pixelmatch/4b.png0.21.31ms1.75ms1.36ms2.20ms1.34x1.29x0.80x
pixelmatch/5a.png0.10.29ms0.43ms0.28ms0.37ms1.48x1.53x1.17x
pixelmatch/5b.png0.10.29ms0.43ms0.27ms0.36ms1.47x1.60x1.19x
pixelmatch/6a.png0.10.35ms0.66ms0.38ms0.46ms1.87x1.71x1.42x
pixelmatch/6b.png0.10.60ms0.94ms0.51ms0.84ms1.56x1.85x1.12x
pixelmatch/7a.png0.30.19ms0.47ms0.18ms0.31ms2.50x2.58x1.49x
pixelmatch/7b.png0.30.18ms0.46ms0.19ms0.31ms2.58x2.49x1.48x
same/1a.png1.72.09ms2.53ms2.63ms9.23ms1.21x0.96x0.27x
same/1b.png1.72.09ms2.53ms2.64ms9.28ms1.21x0.96x0.27x
TOTAL1.31s1.90s1.53s2.09s1.46x1.24x0.91x

Encode, no compression

TOTAL TIME, BEST-OF Β· 36 FIXTURES Β· IO EXCLUDED

BlazeDiffOther librariesLower is better

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)
FixtureMPxblazediffspngimage-rszuneblazediff vs spngimage-rs vs spngzune vs spng
4k/1a.png17.94.35ms30.16ms27.64ms56.75ms6.93x1.09x0.53x
4k/1b.png17.94.83ms36.47ms25.84ms68.77ms7.56x1.41x0.53x
4k/2a.png20.04.64ms32.07ms25.19ms71.57ms6.91x1.27x0.45x
4k/2b.png20.04.63ms45.57ms31.10ms69.71ms9.84x1.47x0.65x
4k/3a.png24.05.63ms61.56ms60.05ms82.34ms10.94x1.03x0.75x
4k/3b.png24.05.63ms61.71ms29.50ms72.25ms10.97x2.09x0.85x
alpha/1a.png0.00.01ms0.04ms0.04ms0.10ms4.66x1.09x0.43x
alpha/1b.png0.00.01ms0.04ms0.04ms0.10ms4.69x1.08x0.43x
blazediff/1a.png0.40.10ms0.48ms0.39ms1.18ms4.88x1.23x0.40x
blazediff/1b.png0.40.10ms0.42ms0.39ms1.14ms4.22x1.09x0.37x
blazediff/2a.png0.40.09ms0.36ms0.31ms0.94ms4.26x1.18x0.39x
blazediff/2b.png0.40.08ms0.37ms0.31ms0.94ms4.41x1.18x0.39x
blazediff/3a.png1.60.36ms2.00ms3.51ms4.86ms5.50x0.57x0.41x
blazediff/3b.png1.60.36ms1.98ms2.28ms4.92ms5.50x0.87x0.40x
blazediff/4a.png3.80.87ms5.35ms5.73ms11.38ms6.17x0.93x0.47x
blazediff/4b.png3.80.87ms6.12ms7.87ms13.12ms7.05x0.78x0.47x
page/1a.png58.916.84ms114ms117ms192ms6.76x0.97x0.59x
page/1b.png58.922.59ms108ms92.34ms196ms4.77x1.17x0.55x
page/2a.png41.712.32ms88.23ms109ms122ms7.16x0.81x0.72x
page/2b.png41.712.08ms78.17ms53.95ms127ms6.47x1.45x0.62x
pixelmatch/1a.png0.10.03ms0.16ms0.10ms0.34ms5.05x1.56x0.47x
pixelmatch/1b.png0.10.03ms0.13ms0.10ms0.34ms4.51x1.33x0.39x
pixelmatch/2a.png0.10.01ms0.08ms0.06ms0.17ms5.25x1.42x0.45x
pixelmatch/2b.png0.10.01ms0.08ms0.05ms0.17ms5.39x1.44x0.47x
pixelmatch/3a.png0.10.03ms0.16ms0.10ms0.34ms5.27x1.55x0.46x
pixelmatch/3b.png0.10.03ms0.16ms0.10ms0.34ms5.27x1.56x0.47x
pixelmatch/4a.png0.20.04ms0.18ms0.15ms0.47ms4.06x1.24x0.38x
pixelmatch/4b.png0.20.05ms0.19ms0.16ms0.49ms4.20x1.16x0.39x
pixelmatch/5a.png0.10.01ms0.07ms0.05ms0.17ms4.60x1.29x0.40x
pixelmatch/5b.png0.10.01ms0.08ms0.05ms0.17ms5.38x1.52x0.47x
pixelmatch/6a.png0.10.01ms0.07ms0.05ms0.18ms4.53x1.25x0.38x
pixelmatch/6b.png0.10.02ms0.07ms0.05ms0.17ms4.56x1.31x0.41x
pixelmatch/7a.png0.30.06ms0.24ms0.20ms0.65ms4.07x1.22x0.37x
pixelmatch/7b.png0.30.06ms0.27ms0.20ms0.65ms4.62x1.38x0.42x
same/1a.png1.70.40ms2.07ms3.45ms4.98ms5.17x0.60x0.42x
same/1b.png1.70.40ms2.57ms3.96ms5.88ms6.49x0.65x0.44x
TOTAL97.60ms679ms602ms1.11s6.96x1.13x0.61x

Encode, half compression

TOTAL TIME, BEST-OF Β· 36 FIXTURES Β· IO EXCLUDED

BlazeDiffOther librariesLower is better

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)
FixtureMPxblazediffspngimage-rszuneblazediff vs spngimage-rs vs spngzune vs spng
4k/1a.png17.91.15s2.80s1.08s55.06ms2.43x2.59x50.89x
4k/1b.png17.9959ms2.51s900ms62.97ms2.61x2.78x39.80x
4k/2a.png20.0963ms3.15s1.10s71.73ms3.27x2.85x43.91x
4k/2b.png20.01.01s3.05s1.12s60.27ms3.02x2.73x50.64x
4k/3a.png24.01.41s3.82s1.46s83.12ms2.70x2.62x45.99x
4k/3b.png24.01.41s3.88s1.47s72.03ms2.75x2.64x53.80x
alpha/1a.png0.00.36ms2.88ms0.37ms0.10ms8.01x7.84x30.06x
alpha/1b.png0.00.36ms2.88ms0.38ms0.10ms7.99x7.68x30.03x
blazediff/1a.png0.43.80ms33.99ms2.96ms1.14ms8.95x11.48x29.83x
blazediff/1b.png0.43.83ms34.20ms2.96ms1.15ms8.92x11.55x29.76x
blazediff/2a.png0.43.31ms27.83ms2.59ms0.93ms8.41x10.73x29.78x
blazediff/2b.png0.43.34ms28.06ms2.68ms0.93ms8.40x10.49x30.25x
blazediff/3a.png1.637.88ms157ms37.58ms4.88ms4.15x4.18x32.20x
blazediff/3b.png1.636.72ms158ms37.02ms4.98ms4.31x4.28x31.80x
blazediff/4a.png3.829.16ms292ms20.48ms11.31ms10.02x14.26x25.83x
blazediff/4b.png3.829.18ms294ms20.45ms12.70ms10.07x14.37x23.14x
page/1a.png58.9822ms5.19s706ms192ms6.32x7.36x27.00x
page/1b.png58.9829ms5.13s695ms194ms6.19x7.38x26.42x
page/2a.png41.7629ms3.67s595ms133ms5.84x6.17x27.55x
page/2b.png41.7619ms3.69s598ms131ms5.96x6.17x28.23x
pixelmatch/1a.png0.11.65ms11.24ms1.72ms0.34ms6.82x6.52x33.36x
pixelmatch/1b.png0.11.65ms11.21ms1.73ms0.34ms6.80x6.47x32.73x
pixelmatch/2a.png0.12.45ms8.91ms3.20ms0.17ms3.63x2.78x51.41x
pixelmatch/2b.png0.12.49ms9.20ms3.31ms0.18ms3.70x2.78x50.33x
pixelmatch/3a.png0.11.34ms10.42ms1.16ms0.34ms7.77x8.99x30.45x
pixelmatch/3b.png0.11.32ms10.43ms1.16ms0.34ms7.93x9.01x30.87x
pixelmatch/4a.png0.26.97ms24.69ms8.84ms0.47ms3.54x2.79x52.02x
pixelmatch/4b.png0.27.05ms25.16ms9.30ms0.47ms3.57x2.71x53.97x
pixelmatch/5a.png0.10.61ms5.07ms0.58ms0.17ms8.37x8.69x29.47x
pixelmatch/5b.png0.10.61ms5.06ms0.58ms0.17ms8.36x8.78x29.70x
pixelmatch/6a.png0.12.11ms7.23ms2.44ms0.18ms3.43x2.96x40.61x
pixelmatch/6b.png0.12.03ms6.88ms2.14ms0.17ms3.39x3.22x40.20x
pixelmatch/7a.png0.33.77ms22.39ms4.05ms0.64ms5.95x5.53x34.74x
pixelmatch/7b.png0.33.77ms22.07ms4.03ms0.66ms5.85x5.47x33.58x
same/1a.png1.715.40ms137ms12.25ms5.18ms8.90x11.19x26.47x
same/1b.png1.715.70ms140ms12.38ms5.86ms8.92x11.30x23.91x
TOTAL10.02s38.37s9.92s1.11s3.83x3.87x34.59x

Encode size, no compression

TOTAL OUTPUT SIZE Β· 36 FIXTURES

BlazeDiffOther librariesLower is better

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)
FixtureMPxblazediffspngimage-rszuneblazediff vs spngimage-rs vs spngzune vs spng
4k/1a.png17.968.4 MB68.5 MB68.4 MB68.5 MB99.8%99.8%100.0%
4k/1b.png17.968.4 MB68.5 MB68.4 MB68.5 MB99.8%99.8%100.0%
4k/2a.png20.076.2 MB76.3 MB76.2 MB76.3 MB99.8%99.8%100.0%
4k/2b.png20.076.2 MB76.3 MB76.2 MB76.3 MB99.8%99.8%100.0%
4k/3a.png24.091.6 MB91.7 MB91.6 MB91.7 MB99.9%99.9%100.0%
4k/3b.png24.091.6 MB91.7 MB91.6 MB91.7 MB99.9%99.9%100.0%
alpha/1a.png0.0144.3 KB144.5 KB144.3 KB144.5 KB99.8%99.8%100.0%
alpha/1b.png0.0144.3 KB144.5 KB144.3 KB144.5 KB99.8%99.8%100.0%
blazediff/1a.png0.41.6 MB1.6 MB1.6 MB1.6 MB99.8%99.8%100.0%
blazediff/1b.png0.41.6 MB1.6 MB1.6 MB1.6 MB99.8%99.8%100.0%
blazediff/2a.png0.41.3 MB1.3 MB1.3 MB1.3 MB99.8%99.8%100.0%
blazediff/2b.png0.41.3 MB1.3 MB1.3 MB1.3 MB99.8%99.8%100.0%
blazediff/3a.png1.66.2 MB6.2 MB6.2 MB6.2 MB99.8%99.8%100.0%
blazediff/3b.png1.66.2 MB6.2 MB6.2 MB6.2 MB99.8%99.8%100.0%
blazediff/4a.png3.814.4 MB14.5 MB14.4 MB14.5 MB99.8%99.8%100.0%
blazediff/4b.png3.814.4 MB14.5 MB14.4 MB14.5 MB99.8%99.8%100.0%
page/1a.png58.9224.9 MB225.2 MB224.9 MB225.2 MB99.8%99.8%100.0%
page/1b.png58.9224.9 MB225.2 MB224.9 MB225.2 MB99.8%99.8%100.0%
page/2a.png41.7159.1 MB159.4 MB159.1 MB159.4 MB99.8%99.8%100.0%
page/2b.png41.7159.1 MB159.4 MB159.1 MB159.4 MB99.8%99.8%100.0%
pixelmatch/1a.png0.1512.4 KB513.1 KB512.4 KB513.1 KB99.8%99.8%100.0%
pixelmatch/1b.png0.1512.4 KB513.1 KB512.4 KB513.1 KB99.8%99.8%100.0%
pixelmatch/2a.png0.1256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%100.0%
pixelmatch/2b.png0.1256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%100.0%
pixelmatch/3a.png0.1512.4 KB513.1 KB512.4 KB513.1 KB99.8%99.8%100.0%
pixelmatch/3b.png0.1512.4 KB513.1 KB512.4 KB513.1 KB99.8%99.8%100.0%
pixelmatch/4a.png0.2705.4 KB706.5 KB705.4 KB706.5 KB99.8%99.8%100.0%
pixelmatch/4b.png0.2705.4 KB706.5 KB705.4 KB706.5 KB99.8%99.8%100.0%
pixelmatch/5a.png0.1256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%100.0%
pixelmatch/5b.png0.1256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%100.0%
pixelmatch/6a.png0.1256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%100.0%
pixelmatch/6b.png0.1256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%100.0%
pixelmatch/7a.png0.3977.2 KB978.7 KB977.2 KB978.6 KB99.8%99.8%100.0%
pixelmatch/7b.png0.3977.2 KB978.7 KB977.2 KB978.6 KB99.8%99.8%100.0%
same/1a.png1.76.6 MB6.6 MB6.6 MB6.6 MB99.8%99.8%100.0%
same/1b.png1.76.6 MB6.6 MB6.6 MB6.6 MB99.8%99.8%100.0%
TOTAL1.28 GB1.28 GB1.28 GB1.28 GB99.8%99.8%100.0%

Encode size, half compression

TOTAL OUTPUT SIZE Β· 36 FIXTURES

BlazeDiffOther librariesLower is better

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)
FixtureMPxblazediffspngimage-rszuneblazediff vs spngimage-rs vs spngzune vs spng
4k/1a.png17.920.6 MB21.3 MB21.5 MB68.5 MB96.6%100.9%320.8%
4k/1b.png17.917.2 MB18.2 MB17.9 MB68.5 MB94.5%98.2%375.4%
4k/2a.png20.026.1 MB27.1 MB26.6 MB76.3 MB96.2%98.3%281.7%
4k/2b.png20.026.6 MB27.6 MB27.2 MB76.3 MB96.6%98.6%276.8%
4k/3a.png24.032.1 MB35.0 MB33.1 MB91.7 MB91.7%94.7%262.2%
4k/3b.png24.031.6 MB34.5 MB32.6 MB91.7 MB91.5%94.4%265.5%
alpha/1a.png0.02.8 KB2.9 KB3.0 KB144.5 KB95.3%100.3%4908.5%
alpha/1b.png0.02.8 KB3.0 KB3.0 KB144.5 KB95.2%99.9%4826.8%
blazediff/1a.png0.430.8 KB35.4 KB30.2 KB1.6 MB86.9%85.4%4770.7%
blazediff/1b.png0.430.9 KB35.4 KB30.3 KB1.6 MB87.1%85.4%4765.8%
blazediff/2a.png0.431.5 KB38.1 KB30.1 KB1.3 MB82.6%79.2%3610.7%
blazediff/2b.png0.432.8 KB39.8 KB31.5 KB1.3 MB82.3%79.2%3449.9%
blazediff/3a.png1.6815.5 KB877.0 KB835.0 KB6.2 MB93.0%95.2%727.6%
blazediff/3b.png1.6792.2 KB853.3 KB812.1 KB6.2 MB92.8%95.2%747.8%
blazediff/4a.png3.898.7 KB114.0 KB100.5 KB14.5 MB86.6%88.2%12998.3%
blazediff/4b.png3.898.3 KB114.1 KB100.4 KB14.5 MB86.1%88.0%12985.2%
page/1a.png58.911.1 MB12.0 MB11.1 MB225.2 MB92.5%92.5%1884.8%
page/1b.png58.911.0 MB11.9 MB11.0 MB225.2 MB92.5%92.5%1886.3%
page/2a.png41.710.3 MB11.0 MB10.4 MB159.4 MB93.9%94.6%1446.2%
page/2b.png41.710.4 MB11.0 MB10.5 MB159.4 MB94.0%94.8%1445.4%
pixelmatch/1a.png0.131.8 KB32.2 KB33.4 KB513.1 KB98.9%103.6%1593.4%
pixelmatch/1b.png0.131.9 KB32.2 KB33.4 KB513.1 KB98.9%103.5%1591.6%
pixelmatch/2a.png0.190.8 KB96.9 KB91.0 KB256.7 KB93.8%93.9%265.0%
pixelmatch/2b.png0.194.4 KB99.9 KB94.3 KB256.7 KB94.4%94.3%257.0%
pixelmatch/3a.png0.113.9 KB14.7 KB13.8 KB513.1 KB94.6%94.2%3497.0%
pixelmatch/3b.png0.113.7 KB14.3 KB13.5 KB513.1 KB95.7%94.5%3593.6%
pixelmatch/4a.png0.2240.1 KB254.1 KB241.3 KB706.5 KB94.5%95.0%278.0%
pixelmatch/4b.png0.2251.0 KB268.1 KB251.9 KB706.5 KB93.6%94.0%263.5%
pixelmatch/5a.png0.13.0 KB3.3 KB3.1 KB256.7 KB91.4%92.3%7693.1%
pixelmatch/5b.png0.13.2 KB3.3 KB3.2 KB256.7 KB98.5%98.4%7793.4%
pixelmatch/6a.png0.144.4 KB50.7 KB48.5 KB256.7 KB87.6%95.6%506.4%
pixelmatch/6b.png0.132.0 KB37.9 KB36.5 KB256.7 KB84.6%96.4%678.0%
pixelmatch/7a.png0.388.2 KB96.1 KB87.4 KB978.6 KB91.8%91.0%1018.8%
pixelmatch/7b.png0.387.3 KB94.8 KB86.5 KB978.6 KB92.1%91.2%1032.4%
same/1a.png1.7124.9 KB140.3 KB126.7 KB6.6 MB89.1%90.3%4847.0%
same/1b.png1.7124.9 KB140.3 KB126.7 KB6.6 MB89.1%90.3%4847.0%
TOTAL200.2 MB213.1 MB205.1 MB1.28 GB93.9%96.3%614.8%

WebAssembly with SIMD, running in Node:

WebAssembly decode (PNG to RGBA8)

TOTAL TIME, BEST-OF Β· 36 FIXTURES Β· IO EXCLUDED

BlazeDiffOther librariesLower is better

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)
FixtureMPxblazediffzune-pngjSquashblazediff vs jSquashzune-png vs jSquash
4k/1a.png17.9185ms223ms398ms2.15x1.78x
4k/1b.png17.9163ms206ms378ms2.31x1.84x
4k/2a.png20.0224ms274ms545ms2.44x1.99x
4k/2b.png20.0232ms269ms547ms2.36x2.03x
4k/3a.png24.0245ms310ms569ms2.32x1.83x
4k/3b.png24.0242ms309ms579ms2.39x1.87x
alpha/1a.png0.00.10ms0.12ms0.36ms3.47x3.13x
alpha/1b.png0.00.11ms0.11ms0.36ms3.32x3.17x
blazediff/1a.png0.40.85ms0.97ms4.32ms5.09x4.45x
blazediff/1b.png0.40.80ms1.00ms4.35ms5.47x4.34x
blazediff/2a.png0.40.74ms0.88ms3.66ms4.92x4.14x
blazediff/2b.png0.40.80ms0.97ms3.71ms4.67x3.84x
blazediff/3a.png1.613.48ms16.19ms36.66ms2.72x2.26x
blazediff/3b.png1.613.52ms16.08ms35.38ms2.62x2.20x
blazediff/4a.png3.84.40ms4.74ms31.96ms7.26x6.74x
blazediff/4b.png3.84.51ms4.78ms31.67ms7.02x6.63x
page/1a.png58.9210ms277ms626ms2.97x2.25x
page/1b.png58.9217ms262ms610ms2.80x2.33x
page/2a.png41.747.61ms53.70ms286ms6.01x5.33x
page/2b.png41.746.96ms51.86ms283ms6.02x5.45x
pixelmatch/1a.png0.10.77ms0.94ms1.82ms2.36x1.94x
pixelmatch/1b.png0.10.61ms0.81ms1.81ms2.98x2.24x
pixelmatch/2a.png0.10.20ms0.23ms0.77ms3.83x3.36x
pixelmatch/2b.png0.10.21ms0.23ms0.78ms3.76x3.31x
pixelmatch/3a.png0.10.58ms0.67ms1.52ms2.60x2.26x
pixelmatch/3b.png0.10.55ms0.67ms1.52ms2.76x2.28x
pixelmatch/4a.png0.21.78ms2.21ms4.31ms2.42x1.95x
pixelmatch/4b.png0.21.99ms2.37ms4.68ms2.35x1.97x
pixelmatch/5a.png0.10.56ms0.59ms1.03ms1.84x1.75x
pixelmatch/5b.png0.10.56ms0.55ms0.75ms1.33x1.36x
pixelmatch/6a.png0.10.68ms0.67ms1.32ms1.93x1.95x
pixelmatch/6b.png0.10.90ms0.99ms1.37ms1.53x1.39x
pixelmatch/7a.png0.30.34ms0.39ms1.90ms5.52x4.88x
pixelmatch/7b.png0.30.34ms0.41ms1.88ms5.48x4.58x
same/1a.png1.73.54ms7.37ms14.08ms3.98x1.91x
same/1b.png1.73.56ms7.43ms14.03ms3.95x1.89x
TOTAL1.87s2.31s5.03s2.69x2.18x

WebAssembly encode, no compression

TOTAL TIME, BEST-OF Β· 36 FIXTURES Β· IO EXCLUDED

BlazeDiffOther librariesLower is better

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)
FixtureMPxblazediffzune-pngblazediff vs zune-png
4k/1a.png17.944.55ms71.50ms1.61x
4k/1b.png17.937.01ms66.31ms1.79x
4k/2a.png20.051.72ms81.47ms1.58x
4k/2b.png20.042.54ms74.70ms1.76x
4k/3a.png24.052.96ms91.61ms1.73x
4k/3b.png24.050.30ms94.01ms1.87x
alpha/1a.png0.00.09ms0.14ms1.60x
alpha/1b.png0.00.09ms0.14ms1.57x
blazediff/1a.png0.40.94ms1.50ms1.59x
blazediff/1b.png0.40.91ms1.50ms1.64x
blazediff/2a.png0.40.75ms1.19ms1.59x
blazediff/2b.png0.40.77ms1.22ms1.59x
blazediff/3a.png1.63.35ms6.20ms1.85x
blazediff/3b.png1.63.42ms5.85ms1.71x
blazediff/4a.png3.87.90ms13.80ms1.75x
blazediff/4b.png3.87.97ms13.63ms1.71x
page/1a.png58.9129ms258ms1.99x
page/1b.png58.9131ms264ms2.01x
page/2a.png41.789.78ms153ms1.71x
page/2b.png41.788.88ms156ms1.76x
pixelmatch/1a.png0.10.28ms0.45ms1.62x
pixelmatch/1b.png0.10.28ms0.47ms1.64x
pixelmatch/2a.png0.10.14ms0.24ms1.66x
pixelmatch/2b.png0.10.14ms0.23ms1.60x
pixelmatch/3a.png0.10.28ms0.45ms1.59x
pixelmatch/3b.png0.10.27ms0.46ms1.66x
pixelmatch/4a.png0.20.38ms0.61ms1.62x
pixelmatch/4b.png0.20.39ms0.63ms1.63x
pixelmatch/5a.png0.10.14ms0.24ms1.63x
pixelmatch/5b.png0.10.14ms0.23ms1.61x
pixelmatch/6a.png0.10.14ms0.22ms1.60x
pixelmatch/6b.png0.10.14ms0.22ms1.62x
pixelmatch/7a.png0.30.52ms0.85ms1.64x
pixelmatch/7b.png0.30.52ms0.86ms1.68x
same/1a.png1.73.58ms6.16ms1.72x
same/1b.png1.73.60ms6.16ms1.71x
TOTAL756ms1.37s1.82x

WebAssembly encode, default settings

TOTAL TIME, BEST-OF Β· 36 FIXTURES Β· IO EXCLUDED

BlazeDiffOther librariesLower is better

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)
FixtureMPxblazediffzune-pngjSquashblazediff vs jSquashzune-png vs jSquash
4k/1a.png17.9236ms65.81ms286ms1.21x4.35x
4k/1b.png17.9225ms70.29ms276ms1.22x3.92x
4k/2a.png20.0234ms73.03ms308ms1.32x4.22x
4k/2b.png20.0240ms74.41ms303ms1.26x4.07x
4k/3a.png24.0304ms87.89ms384ms1.26x4.37x
4k/3b.png24.0304ms89.58ms388ms1.28x4.33x
alpha/1a.png0.00.16ms0.14ms0.23ms1.39x1.59x
alpha/1b.png0.00.16ms0.14ms0.23ms1.38x1.56x
blazediff/1a.png0.43.48ms1.50ms3.17ms0.91x2.11x
blazediff/1b.png0.43.44ms1.52ms3.18ms0.92x2.10x
blazediff/2a.png0.41.38ms1.20ms2.12ms1.53x1.76x
blazediff/2b.png0.41.40ms1.19ms2.14ms1.53x1.79x
blazediff/3a.png1.617.94ms6.10ms18.34ms1.02x3.00x
blazediff/3b.png1.617.72ms5.82ms17.91ms1.01x3.08x
blazediff/4a.png3.823.73ms13.54ms19.57ms0.82x1.44x
blazediff/4b.png3.823.81ms13.54ms19.55ms0.82x1.44x
page/1a.png58.9485ms233ms413ms0.85x1.77x
page/1b.png58.9480ms234ms404ms0.84x1.72x
page/2a.png41.7207ms157ms323ms1.56x2.05x
page/2b.png41.7191ms156ms321ms1.68x2.06x
pixelmatch/1a.png0.11.14ms0.44ms0.93ms0.82x2.10x
pixelmatch/1b.png0.11.19ms0.47ms0.96ms0.81x2.05x
pixelmatch/2a.png0.10.50ms0.24ms0.91ms1.83x3.87x
pixelmatch/2b.png0.10.49ms0.23ms0.89ms1.82x3.92x
pixelmatch/3a.png0.11.12ms0.45ms0.81ms0.73x1.79x
pixelmatch/3b.png0.11.12ms0.46ms0.82ms0.73x1.78x
pixelmatch/4a.png0.22.28ms0.62ms2.62ms1.15x4.26x
pixelmatch/4b.png0.22.28ms0.64ms2.75ms1.21x4.26x
pixelmatch/5a.png0.10.60ms0.24ms0.52ms0.87x2.19x
pixelmatch/5b.png0.10.57ms0.23ms0.52ms0.90x2.28x
pixelmatch/6a.png0.10.80ms0.22ms0.80ms1.00x3.59x
pixelmatch/6b.png0.10.79ms0.22ms0.74ms0.94x3.30x
pixelmatch/7a.png0.31.25ms0.85ms2.04ms1.63x2.41x
pixelmatch/7b.png0.31.22ms0.86ms2.06ms1.69x2.40x
same/1a.png1.712.78ms6.16ms10.73ms0.84x1.74x
same/1b.png1.712.82ms6.16ms10.69ms0.83x1.74x
TOTAL3.04s1.30s3.53s1.16x2.71x

WebAssembly encode size, no compression

TOTAL OUTPUT SIZE Β· 36 FIXTURES

BlazeDiffOther librariesLower is better

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)
FixtureMPxblazediffzune-pngblazediff vs zune-png
4k/1a.png17.968.4 MB68.5 MB99.9%
4k/1b.png17.968.4 MB68.5 MB99.9%
4k/2a.png20.076.2 MB76.3 MB99.9%
4k/2b.png20.076.2 MB76.3 MB99.9%
4k/3a.png24.091.6 MB91.7 MB99.9%
4k/3b.png24.091.6 MB91.7 MB99.9%
alpha/1a.png0.0144.3 KB144.5 KB99.9%
alpha/1b.png0.0144.3 KB144.5 KB99.9%
blazediff/1a.png0.41.6 MB1.6 MB99.9%
blazediff/1b.png0.41.6 MB1.6 MB99.9%
blazediff/2a.png0.41.3 MB1.3 MB99.9%
blazediff/2b.png0.41.3 MB1.3 MB99.9%
blazediff/3a.png1.66.2 MB6.2 MB99.9%
blazediff/3b.png1.66.2 MB6.2 MB99.9%
blazediff/4a.png3.814.4 MB14.5 MB99.9%
blazediff/4b.png3.814.4 MB14.5 MB99.9%
page/1a.png58.9224.9 MB225.2 MB99.9%
page/1b.png58.9224.9 MB225.2 MB99.9%
page/2a.png41.7159.1 MB159.4 MB99.9%
page/2b.png41.7159.1 MB159.4 MB99.9%
pixelmatch/1a.png0.1512.4 KB513.1 KB99.9%
pixelmatch/1b.png0.1512.4 KB513.1 KB99.9%
pixelmatch/2a.png0.1256.3 KB256.7 KB99.9%
pixelmatch/2b.png0.1256.3 KB256.7 KB99.9%
pixelmatch/3a.png0.1512.4 KB513.1 KB99.9%
pixelmatch/3b.png0.1512.4 KB513.1 KB99.9%
pixelmatch/4a.png0.2705.4 KB706.5 KB99.9%
pixelmatch/4b.png0.2705.4 KB706.5 KB99.9%
pixelmatch/5a.png0.1256.3 KB256.7 KB99.9%
pixelmatch/5b.png0.1256.3 KB256.7 KB99.9%
pixelmatch/6a.png0.1256.3 KB256.7 KB99.9%
pixelmatch/6b.png0.1256.3 KB256.7 KB99.9%
pixelmatch/7a.png0.3977.2 KB978.6 KB99.9%
pixelmatch/7b.png0.3977.2 KB978.6 KB99.9%
same/1a.png1.76.6 MB6.6 MB99.9%
same/1b.png1.76.6 MB6.6 MB99.9%
TOTAL1.28 GB1.28 GB99.9%

WebAssembly encode size, default settings

TOTAL OUTPUT SIZE Β· 36 FIXTURES

BlazeDiffOther librariesLower is better

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)
FixtureMPxblazediffzune-pngjSquashblazediff vs jSquashzune-png vs jSquash
4k/1a.png17.919.9 MB68.5 MB25.8 MB76.9%265.1%
4k/1b.png17.918.4 MB68.5 MB24.5 MB74.9%278.9%
4k/2a.png20.028.0 MB76.3 MB37.1 MB75.5%205.4%
4k/2b.png20.028.1 MB76.3 MB37.1 MB75.5%205.3%
4k/3a.png24.035.5 MB91.7 MB43.2 MB82.1%212.3%
4k/3b.png24.035.1 MB91.7 MB42.8 MB82.0%214.5%
alpha/1a.png0.02.3 KB144.5 KB4.5 KB51.1%3235.1%
alpha/1b.png0.02.2 KB144.5 KB4.5 KB49.5%3187.0%
blazediff/1a.png0.467.9 KB1.6 MB152.5 KB44.5%1107.5%
blazediff/1b.png0.468.1 KB1.6 MB152.8 KB44.5%1105.5%
blazediff/2a.png0.419.6 KB1.3 MB77.8 KB25.2%1766.4%
blazediff/2b.png0.420.2 KB1.3 MB79.9 KB25.3%1720.1%
blazediff/3a.png1.6996.6 KB6.2 MB1.2 MB79.2%507.3%
blazediff/3b.png1.6978.8 KB6.2 MB1.2 MB79.0%515.2%
blazediff/4a.png3.8307.2 KB14.5 MB232.3 KB132.2%6376.4%
blazediff/4b.png3.8328.9 KB14.5 MB236.9 KB138.8%6254.4%
page/1a.png58.912.4 MB225.2 MB16.7 MB74.3%1349.0%
page/1b.png58.912.4 MB225.2 MB16.7 MB74.3%1350.0%
page/2a.png41.76.5 MB159.4 MB16.8 MB38.5%945.9%
page/2b.png41.76.5 MB159.4 MB16.9 MB38.4%944.9%
pixelmatch/1a.png0.137.0 KB513.1 KB40.0 KB92.5%1282.6%
pixelmatch/1b.png0.136.9 KB513.1 KB40.0 KB92.4%1283.7%
pixelmatch/2a.png0.144.9 KB256.7 KB122.3 KB36.7%209.9%
pixelmatch/2b.png0.146.0 KB256.7 KB124.7 KB36.9%205.9%
pixelmatch/3a.png0.127.8 KB513.1 KB33.6 KB82.8%1527.2%
pixelmatch/3b.png0.127.9 KB513.1 KB33.7 KB82.8%1521.9%
pixelmatch/4a.png0.2280.8 KB706.5 KB317.8 KB88.4%222.3%
pixelmatch/4b.png0.2299.9 KB706.5 KB338.2 KB88.7%208.9%
pixelmatch/5a.png0.114.6 KB256.7 KB43.5 KB33.5%589.8%
pixelmatch/5b.png0.113.9 KB256.7 KB42.6 KB32.6%602.1%
pixelmatch/6a.png0.182.7 KB256.7 KB105.0 KB78.7%244.5%
pixelmatch/6b.png0.165.5 KB256.7 KB87.5 KB74.9%293.4%
pixelmatch/7a.png0.351.2 KB978.6 KB144.8 KB35.4%675.9%
pixelmatch/7b.png0.350.5 KB978.6 KB143.2 KB35.3%683.6%
same/1a.png1.7206.3 KB6.6 MB306.2 KB67.4%2220.8%
same/1b.png1.7206.3 KB6.6 MB306.2 KB67.4%2220.8%
TOTAL206.8 MB1.28 GB283.2 MB73.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.
Last updated on