Bug 505272

Summary: Imprecise/Wrong sRGB output from LCMS2
Product: [Applications] krita Reporter: Yiming <xp8110>
Component: Color modelsAssignee: Krita Bugs <krita-bugs-null>
Status: REPORTED ---    
Severity: normal    
Priority: NOR    
Version First Reported In: unspecified   
Target Milestone: ---   
Platform: Ubuntu   
OS: All   
Latest Commit: Version Fixed/Implemented In:
Sentry Crash Report:

Description Yiming 2025-06-06 13:14:19 UTC
SUMMARY

LCMS2 will do sRGB curve-fitting to pow 2.2 if  `cmsFLAGS_NOOPTIMIZE` is not set for `cmsCreateTransform()` calls under specific conditions, this leads to noticeably incorrect result especially around dark regions when outputting image from LCMS. From a quick search in Krita code base, I don't see this flag present in places where it's actually needed for correctness.

This can be a non-bug for krita ONLY IF `cmsFLAGS_NOOPTIMIZE` is set for `cmsCreateTransform()` so that LCMS2 will convert the pixels properly via sRGB transfer curves for output.

I am the developer of [OurPaint](https://www.WellObserve.com/OurPaint) and just today I found out why the result is different than doing the color space conversion algorithm manually. I have reported the same thing on [LCMS2](https://github.com/mm2/Little-CMS/issues/496) as well. Krita seems to have the same thing going on, but I doubt if anybody is serious enough to pixel-peep the output.

STEPS TO REPRODUCE

By "the look":

If you are a seasoned artist, and if you observe darker lines/regions in your krita canvas exported "just a little bit darker/richer", then that's the exact problem I'm describing. (Effect more pronounced if use Clay/AdobeRGB compatible color spaces on your canvas)

It's quite tedious to reproduce completely via krita _and_ to get an observable result from the start, but you could try doing it like this:

1. Set a new image to 16bit, Rec2020-ellie-v4-g10.icc (anything that has a different primaries than sRGB and a linear transfer curve.
2. Draw a linear gradient from black to white across the image.
3. Export as PNG, make sure that "convert to sRGB" is selected. This is image `A`
4. Export as PNG, disable "Embed sRGB tag" and convert to sRGB". This is image `B`
5. Open both images in GIMP and convert `B` to something like a Rec2020 but with sRGB transfer function, , then convert the result to sRGB, now you got `B1` (This is the guaranteed correct transform I found for now)
6. In GIMP convert `B` straight to sRGB, you get `B2` (This is broken the same way as krita since both uses lcms2)

OBSERVED RESULT

- `A` matches `B2`
- B1 and B2 is slightly different especially at dark parts.

EXPECTED RESULT

- Both `B1`, `B2` matches `A`  (3 identical images, with maybe off-by-1 conversion errors)

SOFTWARE/OS VERSIONS
(available in the Info Center app, or by running `kinfo` in a terminal window)
Linux/KDE Plasma: Ubuntu 22.05
KDE Plasma Version: -
KDE Frameworks Version: - 
Qt Version: 5?

ADDITIONAL INFORMATION