mirror of
https://github.com/storytold/photocraft.git
synced 2026-10-28 10:11:58 +01:00
The per-file colour fit (`fit_preview_look`) converted the embedded JPEG to sRGB only when the JPEG carried an ICC profile, and otherwise read it as sRGB. A Sony body set to Adobe RGB writes no profile into its previews; it states the colour space only in the raw's EXIF (ColorSpace Uncalibrated with InteropIndex "R03", the DCF option file for Adobe RGB). The fit then targeted a desaturated, hue-shifted reference, and the developed raw came out that way. `photocraft_raw::embedded_preview_color_space` reads that EXIF (sRGB, Adobe RGB or unstated; never for a DNG, whose previews are the converter's), and `preview_profile` uses it when the preview has no ICC profile of its own. A preview's own profile still wins. LightCraft reads the same tags for the same reason (storytold/lightcraft#778). Measured on 19 private Sony ILCE-1M2 ARWs, all shot in Adobe RGB, against the camera's JPEG read as Adobe RGB (median CIE76 ΔE at 240 px): full-frame 400 mm shots against blue sky 5.6-7.0 → 1.5-2.4, their mean a* offset +4.3…+4.9 → +0.7…+1.1; every file improved, mean of the medians 4.9 → 2.2. Tests: `exif_colour_space_of_the_previews` (sRGB, Adobe RGB; R98, a missing interop IFD, other values, a DNG and junk are unstated) and `a_preview_without_a_profile_takes_the_raws_exif_colour_space` (fails without the EXIF fallback; the preview's own ICC profile wins). The hostile-input harness calls the new function. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>