use kuwahara_filter::args::{Args, Parser};
use kuwahara_filter::filter;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args = Args::parse();
let radii = args.parse_radius().map_err(|e| format!("Radius parsing error: {}", e))?;
let img = image::open(&args.input).map_err(|e| {
format!("Failed to open image '{}': {}", args.input.display(), e)
})?;
let rgba_img = img.to_rgba8();
let stem = args
.input
.file_stem()
.and_then(|s| s.to_str())
.ok_or_else(|| {
format!("Failed to extract filename from input path: {}", args.input.display())
})?;
let radius_count = radii.len();
for radius in radii.iter() {
println!("Processing with radius {}...", radius);
let out_img = filter::kuwahara_filter(rgba_img.clone(), *radius as i32);
let out_path = if let Some(ref o) = args.output {
if radius_count == 1 {
o.clone()
} else {
let parent = o.parent().unwrap_or_else(|| std::path::Path::new("."));
let base_name = o.file_stem().and_then(|s| s.to_str()).unwrap_or("output");
let extension = o.extension().and_then(|s| s.to_str()).unwrap_or("png");
parent.join(format!("{}_r{}.{}", base_name, radius, extension))
}
} else {
let new_name = format!("{}_kuwahara-r{}.png", stem, radius);
if let Some(parent) = args.input.parent() {
parent.join(new_name)
} else {
std::path::PathBuf::from(new_name)
}
};
out_img.save(&out_path).map_err(|e| {
format!("Failed to save image to '{}': {}", out_path.display(), e)
})?;
println!("Saved Kuwahara image to {}", out_path.display());
}
if radius_count > 1 {
println!("Completed processing {} images with radii {:?}", radius_count, radii);
}
Ok(())
}