magic-kernel 0.1.1

Implementation of Magic Kernel family of resizing algorithms.
Documentation
use image::{
    codecs::jpeg::JpegEncoder, io::Reader as ImageReader, DynamicImage, Rgb32FImage, RgbImage,
};
use magic_kernel::{magic_resize, ImageF64, Version};

pub fn main() {
    let image = ImageReader::open("example.jpg").unwrap().decode().unwrap();
    let resized = magic_resize(
        &convert_from_image_rs(image),
        Version::MagicKernelSharp2021,
        None,
        Some(500),
    );

    let writer = std::fs::File::create("out.jpg").unwrap();
    let mut encoder = JpegEncoder::new_with_quality(writer, 85);
    encoder.encode_image(&convert_to_image_rs(resized)).unwrap();
}

fn convert_from_image_rs(image: DynamicImage) -> ImageF64 {
    let img_f32 = image.to_rgb32f();
    let samples_layout = img_f32.sample_layout();
    let data = img_f32.to_vec();

    ImageF64::new(
        data.into_iter().map(|val| val as f64).collect(),
        samples_layout.channels,
        samples_layout.width,
        samples_layout.height,
    )
}

fn convert_to_image_rs(image: ImageF64) -> RgbImage {
    let width = image.width();
    let height = image.height();
    let buffer: Vec<_> = image.into();

    let f32_image = Rgb32FImage::from_vec(
        width,
        height,
        buffer.into_iter().map(|x| x as f32).collect(),
    )
    .unwrap();

    DynamicImage::ImageRgb32F(f32_image).to_rgb8()
}