use image::{DynamicImage, GrayImage, Luma, RgbaImage, Rgba};
use log::{debug, info};
pub fn filter_grayscale_values(
image: &GrayImage,
min_value: u8,
max_value: u8,
background: u8
) -> GrayImage {
info!("Filtering grayscale values: min={}, max={}, background={}",
min_value, max_value, background);
let width = image.width();
let height = image.height();
let mut filtered = GrayImage::new(width, height);
for y in 0..height {
for x in 0..width {
let pixel = image.get_pixel(x, y);
let value = pixel[0];
if value >= min_value && value <= max_value {
filtered.put_pixel(x, y, *pixel);
} else {
filtered.put_pixel(x, y, Luma([background]));
}
}
}
filtered
}
pub fn filter_image_values(
image: &DynamicImage,
min_value: u8,
max_value: u8,
background: u8,
transparency: bool
) -> DynamicImage {
info!("Filtering image values: min={}, max={}, background={}, transparency={}",
min_value, max_value, background, transparency);
let gray_image = image.to_luma8();
let width = gray_image.width();
let height = gray_image.height();
if transparency {
let mut rgba = RgbaImage::new(width, height);
for y in 0..height {
for x in 0..width {
let value = gray_image.get_pixel(x, y)[0];
if value >= min_value && value <= max_value {
rgba.put_pixel(x, y, Rgba([value, value, value, 255]));
} else {
rgba.put_pixel(x, y, Rgba([0, 0, 0, 0]));
}
}
}
DynamicImage::ImageRgba8(rgba)
} else {
let filtered = filter_grayscale_values(&gray_image, min_value, max_value, background);
DynamicImage::ImageLuma8(filtered)
}
}
pub fn parse_filter_range(filter_str: &str) -> Result<(u8, u8), String> {
let parts: Vec<&str> = filter_str.split(',').collect();
if parts.len() != 2 {
return Err(format!("Invalid filter range format '{}'. Expected 'min,max'", filter_str));
}
let min_value = match parts[0].trim().parse::<u8>() {
Ok(value) => value,
Err(_) => return Err(format!("Invalid minimum value '{}'. Expected a number between 0-255", parts[0]))
};
let max_value = match parts[1].trim().parse::<u8>() {
Ok(value) => value,
Err(_) => return Err(format!("Invalid maximum value '{}'. Expected a number between 0-255", parts[1]))
};
if min_value > max_value {
return Err(format!("Invalid range: min ({}) is greater than max ({})", min_value, max_value));
}
Ok((min_value, max_value))
}