Perceptual color selector


In the last time, I’ve been working on a perceptual color picker widget, based on the LCH model. I was searching a solution that is intuitive to use for everyone. The most easy-to-use widget for me was always the color wheel with the triangle in the middle. But it is not perceptually uniform: Saturated blue is much darker than saturated yellow, though both are at the same position in the triangle. LCH seems appropriate as a better solution as it is designed following the human perceptual (instead of some technical specifications like RGB).

So I’ve written a library (depending on Qt and LittleCMS) which provides various QWdiget-based widgets. It provides a replacement for QColorDialog as well a WheelColorPicker (like the ones with the triangle in the middle, but really based on the LCH color space) and a ChromaHueDiagram. Furthermore, it contains MultiSpinBox, a new sort of spin box that can contain more than one value (similar to QDateTimeEdit). So, an RGB value or an HLC value can be represented by just one spin box, which saves space. It also makes clear that those values are a group, which is particularly important for HCL values because not all combinations of all values are valid (99% lightness and a chroma of 120 are not likely to exist).

Now I would like to hear what you think about. Is the concept intuitive? Could it be interesting for Krita to use this?

The code of the library is far from ready. What’s working yet is: high-dpi support, complete public API documentation, internal code documentation, unit tests. To a certain degree also integration with QStyle and style sheets works. However, the library does not automatically detect the color profile of the screen. Also, the used algorithms do not work for all types of ICC profiles. The code is currently not optimized (probably multi-threading should speed up things). And in general, the code has some rough edges.

The code is available on Github under MIT license.

Comments are welcome!


I liked the widget and I do think something with LCH would be useful.

Do you think this could be useful for Krita?