turbojpeg 1.5.1

Fast and easy JPEG encoding, decoding and lossless transforms with TurboJPEG
Documentation
use turbojpeg::{Decompressor, Image, PixelFormat, ScalingFactor};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // get the JPEG data
    let jpeg_data = std::fs::read("examples/parrots.jpg")?;

    // initialize a Decompressor
    let mut decompressor = Decompressor::new()?;

    // set the desired downscale factor
    let scale = ScalingFactor::new(7, 8);

    // read the JPEG header with image size
    let header = decompressor.read_header(&jpeg_data)?.scaled(scale);

    println!("{}x{}", header.width, header.height);

    // prepare the destination image
    let mut image = Image {
        pixels: vec![0; 3 * header.width * header.height],
        width: header.width,
        pitch: 3 * header.width, // we use no padding between rows
        height: header.height,
        format: PixelFormat::RGB,
    };

    // set downscale factor
    decompressor.set_scaling_factor(scale)?;

    // decompress the JPEG data
    decompressor.decompress(&jpeg_data, image.as_deref_mut())?;

    // use the raw pixel data
    println!("{:?}", &image.pixels[0..9]);

    // initialize a Compressor
    let mut compressor = turbojpeg::Compressor::new()?;

    compressor.set_quality(99)?;

    // compress the Image to a Vec<u8> of JPEG data
    let jpeg_data = compressor.compress_to_vec(image.as_deref())?;

    std::fs::write("examples/downscaled.tmp.jpg", jpeg_data)?;
    Ok(())
}