mlua-image 0.1.3

Lua bindings and embedding of the Rust based 'image' imaging library.
use crate::ops::filter_type;
use crate::DynamicImage;
use mlua::{AnyUserData, Error, Lua};

pub(super) fn handle(
    _lua: &Lua,
    (ud, nwidth, nheight, filter_string): (AnyUserData, u32, u32, String),
) -> Result<DynamicImage, Error> {
    let image = ud.borrow::<DynamicImage>()?;
    let filter = filter_type::parse(filter_string.as_str())?;
    let resized = image::imageops::resize(&image.delegate, nwidth, nheight, filter);
    Ok(DynamicImage {
        delegate: image::DynamicImage::from(resized),
    })
}

#[cfg(test)]
mod tests {
    use mlua::Lua;
    use std::error::Error;

    #[test]
    fn resize() -> Result<(), Box<dyn Error>> {
        let lua = Lua::new();
        crate::preload(&lua)?;
        let script = r#"
            local image, imageops = require('image'), require('image.ops')
            local img = image.open('testdata/fractal.png')
            local resized = imageops.resize(img, 224, 224, 'triangle')
            return resized:height(), resized:width()
        "#;
        let (height, width): (u32, u32) = lua.load(script).eval()?;
        assert_eq!(height, 224);
        assert_eq!(width, 224);
        Ok(())
    }
}