Pigment's Color Conversion System

Pigment is the new name of what was KritaColor in the good old 1.6 days. With some improvements, like a cleaner API, and more shared source code, mostly thanks to templates (in 1.6, more than 60% of the code was duplicated, either directly in the library or in the various plugins).

One of the biggest drawback was color conversion. KritaColor was created to abstract color, in such way that filters, tools or any other algorithms in Krita didn’t have to care about the color space of an image. And in fact, it was first conceived around the lcms library, which is a color management library which handles ICC color space, that means RGB, CMYK, LAB, grayscale,… in integer 8bit or 16bit. But Krita also supports High-Dynamic Range color space, which are mostly floating points color space in 16bit or 32bit. And unfortunately in KritaColor, when a color space was not handled by lcms, colors were first convert to LAB/Integer 16bit, but that meant losing High-Dynamic Range information, as for those color space a lot of important information is stored near 0.0 or above 1.0, information lost when converting to an integer color space, not counting the conversion from 32bit to 16bit.

But I want Krita 2(.0) to be a reliable, high quality, extra, super, cool, (put here any other positive term) High-Dynamic Range imaging application. And thanks to the introduction, during the last few week, of the Color Conversion System (CCS), it’s now possible to have reliable color conversion between two High-Dynamic Range color spaces. And that’s cool, because one of the main task in the High-Dynamic Range work flow is to convert to Low-Dynamic Range (a process called tonemapping), but most algorithms to accomplish that task use the XYZ color space, while most images are in RGB, that means that the image first need to be converted to XYZ (and now you understand why it is interesting to keep the High-Dynamic Range information).

I can’t really make a screen shot of color conversion, so to prove that I can make boring and obscure illustration, here is the graph of direct color conversion in pigment:

The annoyance is that you can’t expect author of a color space to provide a color conversion for each other color spaces. So there must be a mechanism to create a link of color conversion from one color space to an other one. So the main task of the Color Conversion System is to create the graph of possible color conversion, and to use it to find the best color conversion.

This entry was posted in Krita, Open Source and tagged , , , . Bookmark the permalink.

5 Responses to Pigment's Color Conversion System

  1. Seb Ruiz says:

    That graph looks impressively sophisticated!

  2. Mark says:

    This seems rather “over” complicated. You shouldn’t need each author to support converting to every other format. Why not pick one common format that they all can be converted to/from ? If you pick one of the HDR formats you should then be able to convert from anything to anything without image degradation correct ?

  3. Benoit says:

    Great job Cyrille! Good to have you working on that stuff! I’m not myself in a position to understand all the subtlety but at least I understand it is an essential part of a modern imaging app.

  4. Cyrille Berger says:

    @mark, it’s very difficult to find a common format that will work accurately for all format. For instance, ICC defines two of them LAB and XYZ, a spectral color space could be a solution, but then it would be awfully complicated to write a color transformation. You also wants to have direct connection whenever it is possible, mostly for speed reason.

  5. sim0n says:

    Great Job! :-)I’m not really into this color stuff, but I was wondering if you had a look at gegl ? (http://www.gegl.org)It does pretty much all the work, like color conversion to just like any format and from any format.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>