extern crate image; extern crate psnr; use std::env::args; use std::fs; use image::ImageResult; use psnr::psnr_files; fn psnr_dir(path1: &str, path2: &str) -> Vec<(String, ImageResult)> { let mut dirs1: Vec<_> = fs::read_dir(path1).unwrap() .map(|x|x.unwrap()) .filter(|x| x.file_name().into_string().unwrap().ends_with(".png")) .map(|x| x.file_name().to_owned().into_string().unwrap()) .collect(); let metadata = fs::metadata(path2).unwrap(); let mut dirs2: Vec<_> = if metadata.is_dir() { fs::read_dir(path2).unwrap() .map(|x|x.unwrap()) .filter(|x| x.file_name().into_string().unwrap().ends_with(".png")) .map(|x| x.file_name().to_owned().into_string().unwrap()) .collect() } else { vec![path2.to_owned()] }; dirs1.sort(); dirs2.sort(); let mut res = vec!(); for file in dirs1 { let p1 = path1.to_owned() + &file; let p2 = if dirs2.len() != 1 { path2.to_owned() + &file } else { path2.to_owned() }; let psnr = psnr_files(&p1, &p2); let elt = (file, psnr.unwrap()); println!("{} {}", elt.0, elt.1); res.push((elt.0, Ok(elt.1))); } res } fn main() { let path1 = args().nth(1).unwrap(); let path2 = args().nth(2).unwrap(); let _ = psnr_dir(&path1, &path2); }