This workspace features a set of small, independent and performant image codecs that can be used for decoding maniuplating 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 benchmarksExtensive
u8
, u16
and f32
images. This means we support HDR image processing. This isn't limited to image
decoders and encoders but image filters support it to.image.convert_color
Easy to use api
decode_headers
which allows one to retrieve image information without decoding the
imagenew
and new_with_options
, with the former using default options and the latter
using custom options
allowing you to customize decodingdepth
for image depth, colorspace
for image
colorspace, dimensions
for image dimensionsOperationsTrait
, decoders DecoderTrait
and encoders EncoderTrait
Safe
#![forbid(unsafe)]
most unsafe comes from SIMD
routines which will reduce when portable-simd becomes mainstreamA 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, like zune-png
deals with png
decodingzune-imageprocs
deals with image processing routines, etc etctests
: 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 decoderdocs
: Documentation on various parts of the libraryRust 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.