j2k-native 0.6.1

Pure-Rust JPEG 2000 and HTJ2K codec engine for j2k
Documentation
use j2k_native::{encode, DecodeSettings, DecoderContext, EncodeOptions, Image};

fn fixture() -> Vec<u8> {
    let pixels = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
    let options = EncodeOptions {
        reversible: true,
        num_decomposition_levels: 1,
        ..EncodeOptions::default()
    };
    encode(&pixels, 2, 2, 3, 8, false, &options).expect("encode")
}

#[test]
fn decoded_components_expose_component_planes() {
    let bytes = fixture();
    let image = Image::new(&bytes, &DecodeSettings::default()).expect("image");
    let mut context = DecoderContext::default();
    let bitmap = image
        .decode_with_context(&mut DecoderContext::default())
        .expect("bitmap");
    let planes = image
        .decode_components_with_context(&mut context)
        .expect("component decode");

    assert_eq!(planes.dimensions(), (2, 2));
    assert_eq!(planes.planes().len(), 3);
    assert_eq!(planes.planes()[0].bit_depth(), 8);
    assert!(planes
        .planes()
        .iter()
        .all(|plane| plane.samples().len() == 4));

    let mut interleaved = Vec::with_capacity(12);
    for idx in 0..4 {
        for plane in planes.planes() {
            interleaved.push(plane.samples()[idx].round() as u8);
        }
    }
    assert_eq!(interleaved, bitmap.data);
}

#[test]
fn decoded_region_components_expose_cropped_component_planes() {
    let bytes = fixture();
    let image = Image::new(&bytes, &DecodeSettings::default()).expect("image");
    let mut context = DecoderContext::default();
    let bitmap = image
        .decode_region_with_context((1, 0, 1, 2), &mut DecoderContext::default())
        .expect("bitmap");
    let planes = image
        .decode_region_components_with_context((1, 0, 1, 2), &mut context)
        .expect("component region decode");

    assert_eq!(planes.dimensions(), (1, 2));
    assert_eq!(planes.planes().len(), 3);
    assert!(planes
        .planes()
        .iter()
        .all(|plane| plane.samples().len() == 2));

    let mut interleaved = Vec::with_capacity(6);
    for idx in 0..2 {
        for plane in planes.planes() {
            interleaved.push(plane.samples()[idx].round() as u8);
        }
    }
    assert_eq!(interleaved, bitmap.data);
}