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 spng

BlazeDiff vs spng

blazediff-png decodes the same pixels spng decodes and is ~31% faster at it. Compressed encode is ~3.8x faster, and the files come out smaller. Both are single-threaded codecs. spng is C and blazediff-png is Rust.

libspng is a security-focused C PNG library with a simpler API than libpng. BlazeDiff used it through FFI before it had its own codec. blazediff-png replaces it on its own terms. With the default backend, it returns the same accept or reject decision and the same pixels as spng, for valid files and for malformed chunks and deflate streams. The test suite checks this on a 395-file corpus that includes PngSuite.

At a glance

spng (libspng)BlazeDiff (blazediff-png)
LicenseBSD-2-ClauseMIT
LanguageCRust
DeliverySource files, built with CMake or Mesoncrates.io; Node and wasm packages @blazediff/codec-png-*
Decode formatsEvery PNG format, to many SPNG_FMT_* outputsEvery PNG format, to RGBA8 or any SPNG_FMT_* output (decode_with)
Encodezlib levelslibdeflate levels 1 to 12, plus stored
Streaming / progressiveYesStreaming encode (encode_to); whole-buffer decode
Parallel encodeNoOptional parallel feature
Deflate backendzlib or minizSystem zlib + libdeflate, or pure Rust (rust-backend)

Benchmarks

The compressed encode compares the default levels: libdeflate 6 in blazediff-png and zlib 4 in spng. Decode is 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%

Switching

# Cargo.toml [dependencies] blazediff-png = "6"
use blazediff_png::{decode, encode, EncodeOptions}; let bytes = std::fs::read("image.png")?; let image = decode(&bytes)?; // RGBA8: Image { data, width, height } let png = encode(&image, &EncodeOptions::default())?;

There is one deliberate difference. The PNG specification says a decoder must mask a gray tRNS key to the image bit depth. spng does not, and blazediff-png does, as image-rs does. Only files from encoders that leave the unused key bits set decode differently: those pixels are transparent in blazediff-png and opaque in spng.

When to keep spng

  • Your project is C or C++ and you do not want a Rust toolchain.
  • You need progressive or streaming decode.
  • You rely on spng’s security record: CERT C rules, OSS-Fuzz, Coverity and PVS-Studio.
Last updated on