This workspace features a set of small, independent and performant image codecs that can be used for decoding manipulating and sometimes encoding images in a variety of formats.
The set of codecs aim to have the following features in order of priority:
zune-jpeg
should easily replace libjpeg-turbo
without any noticeable speed loss.unsafe
code, with the sole exception of SIMD intrinsics which currently require unsafe
.Single interface
Fast
zune-*
image decoders are some of the fastest,
see benchmarks.Extensive
u8
, u16
and f32
images. This means we support HDR image processing. This isn't limited to image
decoders and encoders: image filters support it too.image.convert_color
.Easy to use api
decode_headers
which allows one to retrieve image information without decoding the
image.new
and new_with_options
, with the former using default options and the latter
using custom options
allowing you to customize decoding.depth
for image depth, colorspace
for image
colorspace, dimensions
for image dimensions.OperationsTrait
, decoders DecoderTrait
and encoders EncoderTrait
.Safe
#![forbid(unsafe)]
. Most unsafe comes from SIMD
routines which will reduce when portable-simd becomes mainstream.A command line application.
Bindings to other languages
(Limited) support for animated images
Image Format | Decoder | Encoder | no_std Support |
---|---|---|---|
jpeg | zune-jpeg | jpeg-encoder | Yes |
png | zune-png | - | Yes |
ppm | zune-ppm | zune-ppm | Yes |
qoi | zune-qoi | zune-qoi | Yes |
farbfeld | zune-farbfeld | zune-farbfeld | Yes |
psd | zune-psd | - | Yes |
jpeg-xl | jxl-oxide | zune-jpegxl | Yes [^1] |
hdr | zune-hdr | zune-hdr | No [^2] |
floor
and exp
in the core
library.This workspace allows only 1 type of unsafe: platform specific intrinsics (e.g. SIMD), and only where speed really matters.
All other types are explicitly forbidden.
crates
Contain main image code, each crate is prefixed with zune-
.
The crates are divided into image formats, e.g. zune-png
deals with png
decoding.zune-imageprocs
deals with image processing routines, etc.tests
: Image testing routines, they mainly read from test-images
.benchmarks
: Benchmarking routines, they test the library routines with other popular image libraries.fuzz-corpus
: Some interesting image files used for fuzzing.test-images
: Images for testing various aspects of the decoder.docs
: Documentation on various parts of the library.Rust already has a good image library i.e. https://github.com/image-rs/image.
But I'll let the overall speed of operations (decoding, applying image operations like blurring) speak for itself when compared to other implementations.
Library benchmarks are available online and also reproducible offline.
To reproduce benchmarks you can run the following commands.
Tested, on Linux, but should work for most operating systems.
git clone https://github.com/etemesi254/zune-image
cd ./zune-image
cargo bench --workspace
This will create a criterion directory in target which will contain benchmark results of most image decoding operations.
Most decoders are tested in CI to ensure new changes do not introduce regressions.
Critical decoders are fuzz tested in CI once every day to catch any potential issue/bug.