grib 0.17.0

GRIB format parser & writer for Rust
Documentation
use hayro_jpeg2000::{DecodeSettings, DecoderContext, Image};

use crate::DecodeError;

pub(crate) type ImageIntoIter = std::vec::IntoIter<i32>;

pub(crate) fn decode_j2k(bytes: &[u8]) -> Result<ImageIntoIter, DecodeError> {
    let image = Image::new(bytes, &DecodeSettings::default())
        .map_err(|err| DecodeError::from(format!("parsing JPEG 2000 image failed: {err}")))?;
    let mut context = DecoderContext::default();
    let decoded = image
        .decode(&mut context)
        .map_err(|err| DecodeError::from(format!("decoding JPEG 2000 image failed: {err}")))?;
    let [component] = decoded.components() else {
        return Err(DecodeError::from(
            "unexpected non-gray-scale image components",
        ));
    };

    let samples = component
        .samples()
        .iter()
        .map(|&sample| {
            if !sample.is_finite()
                || sample.fract() != 0.0
                || sample < i32::MIN as f32
                || sample >= i32::MAX as f32
            {
                return Err(DecodeError::from(
                    "JPEG 2000 component contains an invalid integer sample",
                ));
            }
            Ok(sample as i32)
        })
        .collect::<Result<Vec<_>, _>>()?;

    Ok(samples.into_iter())
}