use image::{DynamicImage, Rgb, RgbImage};
pub fn apply_tone_map_if_needed(img: DynamicImage) -> DynamicImage {
match img {
DynamicImage::ImageRgb32F(f32_img) => DynamicImage::ImageRgb8(reinhard_rgb32f(&f32_img)),
other => other,
}
}
fn reinhard_rgb32f(img: &image::Rgb32FImage) -> RgbImage {
let (w, h) = img.dimensions();
RgbImage::from_fn(w, h, |x, y| {
let px = img.get_pixel(x, y);
Rgb([
tone_map_channel(px[0]),
tone_map_channel(px[1]),
tone_map_channel(px[2]),
])
})
}
fn tone_map_channel(v: f32) -> u8 {
let l = v.max(0.0);
let mapped = l / (1.0 + l);
(mapped * 255.0).clamp(0.0, 255.0) as u8
}