* fix: don't strip ICC from exif Signed-off-by: ispik <ispik@ispik.dev> * fix: refactor ICC profile handling in image processing Signed-off-by: ispik <ispik@ispik.dev> --------- Signed-off-by: ispik <ispik@ispik.dev>
32 lines
1.0 KiB
Rust
32 lines
1.0 KiB
Rust
/// Convert image to sRGB using the provided ICC profile.
|
|
/// Returns the converted image, or the original if conversion fails.
|
|
pub fn apply_icc_profile(image: image::DynamicImage, icc: &[u8]) -> image::DynamicImage {
|
|
let Ok(src_profile) = lcms2::Profile::new_icc(icc) else {
|
|
return image;
|
|
};
|
|
let dst_profile = lcms2::Profile::new_srgb();
|
|
let format = if image.color().has_alpha() {
|
|
lcms2::PixelFormat::RGBA_8
|
|
} else {
|
|
lcms2::PixelFormat::RGB_8
|
|
};
|
|
let Ok(t) = lcms2::Transform::new(
|
|
&src_profile,
|
|
format,
|
|
&dst_profile,
|
|
format,
|
|
lcms2::Intent::Perceptual,
|
|
) else {
|
|
return image;
|
|
};
|
|
if image.color().has_alpha() {
|
|
let mut rgba_image = image.into_rgba8();
|
|
t.transform_in_place(rgba_image.as_mut());
|
|
image::DynamicImage::ImageRgba8(rgba_image)
|
|
} else {
|
|
let mut rgb_image = image.into_rgb8();
|
|
t.transform_in_place(rgb_image.as_mut());
|
|
image::DynamicImage::ImageRgb8(rgb_image)
|
|
}
|
|
}
|