From 26e3ca684bc5cb16b604c29b1b325e02278a84d1 Mon Sep 17 00:00:00 2001 From: Djeex Date: Sun, 16 Aug 2026 23:25:34 +0200 Subject: [PATCH] Fixed: Preserve embedded ICC color profiles when converting and resizing images Image.open() reads the source's ICC profile into img.info, but that dict resets to empty after convert() or resize(), and save() was never passing icc_profile anyway. DCI-P3 and Rec.2020 photos were silently falling back to sRGB interpretation once processed. --- src/py/builder/image_processor.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/py/builder/image_processor.py b/src/py/builder/image_processor.py index a9cf0f6..7adf661 100644 --- a/src/py/builder/image_processor.py +++ b/src/py/builder/image_processor.py @@ -11,6 +11,7 @@ def convert_and_resize_image(input_path, output_path, resize=True, max_width=114 return img = Image.open(input_path) + icc_profile = img.info.get("icc_profile") if img.mode != "RGB": img = img.convert("RGB") @@ -27,7 +28,10 @@ def convert_and_resize_image(input_path, output_path, resize=True, max_width=114 if fmt == "JPEG": output_path = output_path.with_suffix(".jpg") - img.save(output_path, fmt, quality=90 if fmt == "JPEG" else 100) + save_kwargs = {"quality": 90 if fmt == "JPEG" else 100} + if icc_profile: + save_kwargs["icc_profile"] = icc_profile + img.save(output_path, fmt, **save_kwargs) logging.info(f"[✓] Processed image: {input_path} → {output_path}") except Exception as e: