#png #decoder #png-decoder

no-std zune-png

A fast, correct and safe png decoder

7 unstable releases (3 breaking)

0.5.0-rc1 Apr 16, 2024
0.5.0-rc0 Apr 7, 2024
0.4.10 Jan 15, 2024
0.4.0 Nov 8, 2023
0.1.9 Mar 29, 2023

#349 in Images

Download history 285/week @ 2024-10-22 576/week @ 2024-10-29 351/week @ 2024-11-05 486/week @ 2024-11-12 253/week @ 2024-11-19 194/week @ 2024-11-26 193/week @ 2024-12-03 369/week @ 2024-12-10 346/week @ 2024-12-17 343/week @ 2024-12-24 191/week @ 2024-12-31 376/week @ 2025-01-07 440/week @ 2025-01-14 396/week @ 2025-01-21 312/week @ 2025-01-28 403/week @ 2025-02-04

1,627 downloads per month
Used in 14 crates (7 directly)

MIT OR Apache-2.0 OR Zlib

410KB
6K SLoC

Zune-png

A fast, correct and safe png decoder

Limitations

  • This decoder (currently) expands images with less than 8 bpp to be 8 bits(one byte) automatically. This may or may not be desired depending on your use cases.

Features

  • Fast deflate decoder
  • Vectorized filters and bit manipulation
  • Memory friendly (few allocations)
  • Zero unsafe outside of platform specific intrinsics
  • Support for animated image decoding up until the post-processing.

Usage

First, include this in your Cargo.toml

[dependencies]
zune-png = "0.2.0"

Then you can access the decoder in your library/binary.

use zune_png::PngDecoder;
// decode bytes
let decoder = PngDecoder::new(b"bytes").decode().unwrap();

Debug vs release

The decoder heavily relies on platform specific intrinsics, namely AVX2 and SSE to gain speed-ups in decoding, but they perform poorly in debug builds. To get reasonable performance even when compiling your program in debug mode, add this to your Cargo.toml:

# `zune-png` package will be always built with optimizations
[profile.dev.package.zune-png]
opt-level = 3

Benchmarks

The updated benchmarks comparing this decoder with other Rust and C decoders can be found here with the png prefix. Benchmarks are updated regularly to keep up with optimizations added.

Dependencies