Rust bindings for TurboJPEG, which provides simple and fast compression/decompression of JPEG images.
TurboJPEG is a high-level API provided by [libjpeg-turbo].
Use turbojpeg::Compressor
to compress raw pixel data into JPEG (see
examples/simple_compress.rs
for full example):
```rust use turbojpeg::{Compressor, Image, PixelFormat};
// prepare the raw pixel data
let width: usize = ...;
let height: usize = ...;
let pixels: Vec
// initialize a Compressor let mut compressor = Compressor::new()?;
// create an Image that bundles a reference to the raw pixel data (as &[u8]) // with information about the image format let image = Image { pixels: pixels.as_slice(), width: width, pitch: 3 * width, // there is no padding between rows height: height, format: PixelFormat::RGB, };
// compress the Image to a Vec
To decompress JPEG data into a raw pixel data, use turbojpeg::Decompressor
(full example in examples/simple_decompress.rs
):
```rust use turbojpeg::{Decompressor, Image, PixelFormat};
// get the JPEG data let jpeg_data: &[u8] = ...;
// initialize a Decompressor let mut decompressor = Decompressor::new()?;
// read the JPEG header with image size let header = decompressor.readheader(jpegdata)?; let (width, height) = (header.width, header.height);
// prepare a storage for the raw pixel data let mut pixels = vec![0; 3widthheight]; let image = Image { pixels: pixels.asmutslice(), width: width, pitch: 3 * width, // we use no padding between rows height: height, format: PixelFormat::RGB, };
// decompress the JPEG data decompressor.decompresstoslice(jpeg_data, image)?;
// use the raw pixel data println!("{:?}", &pixels[0..9]); ```
See other examples in examples/
or read the docs for more information.
The low-level binding to libturbojpeg
is provided by the crate
turbojpeg-sys
, which needs:
bindgen
.rustc
will use to link against libturbojpeg
.By default, the turbojpeg-sys
crate uses a pregenerated Rust binding code (so
you don't need the C headers) and the default linker flags -l turbojpeg
.
However, this behavior can be altered in several ways:
pkg-config
uses the pkg-config
tool to find the linker flags
and the include paths for C headers that are specific for your system.TURBOJPEG_INCLUDE_PATH
, if specified, adds an extra
include path for C headers.bindgen
uses the bindgen
tool to generate Rust binding code
at build time, instead of using the pregenerated code. If no include paths
are specified (using pkg-config
or TURBOJPEG_INCLUDE_PATH
), we use
headers that are bundled with turbojpeg-sys
.All this magic is implemented in the build.rs
script in turbojpeg-sys
. If
you think that it could be improved, or if you encounter an error on your
system, please open an issue or a pull request.
All contributions are welcome! Please contact me (@honzasp) or open a pull request. This crate is rather minimal, the main areas of improvement are:
turbojpeg
crate.turbojpeg-sys
crate, so that it works
seamlessly on a wide range of systems.This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means.