use std::env;
use std::path::Path;
use anyhow::Result;
use image::DynamicImage;
use jpeg2k::*;
fn main() -> Result<()> {
dotenv::dotenv().ok();
env_logger::init();
let jp2_filename = env::args().nth(1).unwrap_or_else(|| "test.j2k".to_string());
let savename = env::args().nth(2).unwrap_or_else(|| "test.jpg".to_string());
let reduce = env::args()
.nth(3)
.unwrap_or_else(|| "0".to_string())
.parse::<u32>()
.expect("Reduce must be an integer.");
let layers = env::args()
.nth(4)
.unwrap_or_else(|| "0".to_string())
.parse::<u32>()
.expect("Layers must be an integer.");
let decode_area = env::args()
.nth(5)
.and_then(|area| area.parse::<DecodeArea>().ok());
let params = DecodeParameters::new()
.reduce(reduce)
.layers(layers)
.decode_area(decode_area);
let jp2_image = Image::from_file_with(jp2_filename, params)?;
println!("dump image: {:#?}", jp2_image);
println!(
"jp2_image: width={:?}, height={:?}",
jp2_image.width(),
jp2_image.height()
);
let out_name = Path::new(&savename);
let ext = out_name.extension().and_then(|e| e.to_str());
match ext {
Some("j2k") | Some("jp2") => {
jp2_image.save_as_file(out_name)?;
}
_ => {
let img: DynamicImage = (&jp2_image).try_into()?;
img.save(&savename)?;
}
}
println!("Saved to: {out_name:?}");
Ok(())
}