Crates.io | zune-jpeg |
lib.rs | zune-jpeg |
version | 0.4.14 |
source | src |
created_at | 2022-05-09 16:17:56.849281 |
updated_at | 2024-12-12 13:58:43.744669 |
description | A fast, correct and safe jpeg decoder |
homepage | |
repository | https://github.com/etemesi254/zune-image/tree/dev/crates/zune-jpeg |
max_upload_size | |
id | 583384 |
size | 262,786 |
A fast, correct and safe jpeg decoder in pure Rust.
The library provides a simple-to-use API for jpeg decoding and an ability to add options to influence decoding.
// Import the library
use zune_jpeg::JpegDecoder;
use std::fs::read;
fn main()->Result<(),DecoderErrors> {
// load some jpeg data
let data = read("cat.jpg").unwrap();
// create a decoder
let mut decoder = JpegDecoder::new(&data);
// decode the file
let pixels = decoder.decode()?;
}
The decoder supports more manipulations via DecoderOptions
,
see additional documentation in the library.
The implementation aims to have the following goals achieved, in order of importance
unsafe
is only used for SIMD intrinsics,
and can be turned off entirely both at compile time and at runtime.no_std
feature | on | Capabilities |
---|---|---|
x86 |
yes | Enables x86 specific instructions, specifically avx and sse for accelerated decoding. |
std |
yes | Enable linking to the std crate |
Note that the x86
features are automatically disabled on platforms that aren't x86 during compile
time hence there is no need to disable them explicitly if you are targeting such a platform.
no_std
environmentThe crate can be used in a no_std
environment with the alloc
feature.
But one is required to link to a working allocator for whatever environment the decoder will be running on
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-jpeg` package will be always built with optimizations
[profile.dev.package.zune-jpeg]
opt-level = 3
The library tries to be at fast as libjpeg-turbo while being as safe as possible. Platform specific intrinsics help get speed up intensive operations ensuring we can almost match libjpeg-turbo speeds but speeds are always +- 10 ms of this library.
For more up-to-date benchmarks, see the online repo with benchmarks here