c++ - 使用 ICC 配置文件将 L*a*b* 转换为 RGB

标签 c++ c colors rgb color-management

我想在移动设备 Android/iPhone 上显示正确的颜色,所以我为每个设备创建了一个 ICC 配置文件。我的颜色采用 L*a*b* (CIELAB) 格式。从 L*a*b* 到 RGB 的转换通过 XYZ 颜色空间进行,我使用来自 Bruce Lindbloom's 的数学网页。

问题是,将 XYZ 转换为 RGB 的算法(整个网络,不仅在 Lindbloom 的网站上)直接转换为 sRGB 配置文件。然后我从 sRGB 转换为我设备的 ICC 配置文件(我使用来自 www.color.org 的“SampleICC”库)。有没有办法将 XYZ 值直接转换为我设备的配置文件并跳过 sRGB,最好使用 SampleICC 库,或者是否有任何其他 C/C++ 库用于应用 ICC 配置文件? ...带有文档和/或示例。我想要这个以获得更高的精度。

编辑: 基于@Nikita Nemkin 的建议,我尝试了使用内置实验室配置文件的小型 CMS,并创建了如下转换:

cmsHPROFILE outProfile = cmsOpenProfileFromFile("my_profile.icm", "r");
// Lab to RGB with custom ICC profile
g_LcmsTransform = cmsCreateTransform(cmsCreateLab4Profile(cmsD50_xyY()), TYPE_Lab_DBL, outProfile, TYPE_RGB_DBL, INTENT_RELATIVE_COLORIMETRIC, 0);

这给了我一些不同的结果,然后我以前的算法(Lab -> XYZ -> sRGB -> RGB with custom ICC profile)使用 SampleICC 库,特别是对于较暗的颜色。 这是部分原因,因为我在我的第一个算法中没有在 Lab -> XYZ 转换中调整较暗的颜色。 真正糟糕的是,这两种转换给出的结果与 Photoshop 中的转换不同。例如:

Lab (18, -30, 70) is sRGB (0, 54, 0)
SampleICC RGB (39, 57, 24)
SampleICC RGB with proper dark colors handling (45, 57, 24)
LittleCMS RGB (39, 54, 0)
Photoshop RGB (45, 55, 0)

所有转换都是通过相对色度意图完成的,在 Photoshop 中我使用了黑点补偿和 Adob​​e 引擎。我应该相信哪个号码?有没有 100% 可靠的软件可以检查我的值?

最佳答案

Little CMS是一个流行的开源(麻省理工学院许可)色彩管理库。它应该能够做你想做的事。

关于c++ - 使用 ICC 配置文件将 L*a*b* 转换为 RGB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16958624/

相关文章:

c++ - 如何立即终止我的程序

c++ - gcc:使用另一个目录中的函数

c++ - 使用 composite_key 和按位与比较 boost multi_index_container

c++ - unsigned char 类型的负数

c - 如何在 gtk 中刷新、重绘窗口(小部件)?

ios - ScrollView 和导航栏 SwiftUI 的屏幕背景颜色

以 Vector 对象为成员的 C++ Sprite 类

CTRL-D 退出程序而不只是循环

windows - 如何在 Windows 命令行中用不同的颜色回显

css Gif 白色背景描边?