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

C++ 使用ICC配置文件将L*a*b*转换为RGB,c++,c,colors,rgb,color-management,C++,C,Colors,Rgb,Color Management,我想在Android/iPhone移动设备上显示正确的颜色,所以我为每个设备创建了一个ICC配置文件。我的颜色是L*a*b*(CIELAB)格式。从L*a*b*到RGB的转换要经过XYZ颜色空间,我使用网络上的数学 问题是,将XYZ转换为RGB(在整个web上,而不仅仅是在Lindbloom的web上)的算法直接转换为sRGB配置文件。然后,我将sRGB转换为设备的ICC配置文件(我使用www.color.org上的“SampleICC”库)。是否有一种方法可以直接将XYZ值转换到我的设备的配置

我想在Android/iPhone移动设备上显示正确的颜色,所以我为每个设备创建了一个ICC配置文件。我的颜色是L*a*b*(CIELAB)格式。从L*a*b*到RGB的转换要经过XYZ颜色空间,我使用网络上的数学

问题是,将XYZ转换为RGB(在整个web上,而不仅仅是在Lindbloom的web上)的算法直接转换为sRGB配置文件。然后,我将sRGB转换为设备的ICC配置文件(我使用www.color.org上的“SampleICC”库)。是否有一种方法可以直接将XYZ值转换到我的设备的配置文件并跳过sRGB,最好使用SampleICC库,或者是否有任何其他C/C++库用于应用ICC配置文件。。。提供文档和/或示例。我想要这个更精确

编辑: 基于@Nikita Nemkin advise,我尝试了小型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);
这给了我一点不同的结果,然后是我以前使用SampleICC库的算法(Lab->XYZ->sRGB->RGB和自定义ICC配置文件),特别是对于较暗的颜色。这部分是因为在我的第一个算法中,我没有在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中使用了黑点补偿和Adobe引擎。我应该相信哪个号码?是否有任何100%可靠的软件来检查我的值?

是一个流行的开源(MIT许可证)颜色管理库。它应该可以做你想做的事。

我不确定我是否理解你想要什么。是否要将XYZ转换为RGB而不是sRGB?在很多地方,比如维基百科,你应该可以找到这样做的公式。无论如何,这应该是一个两步的过程XYZ->RGB->sRGB,所以如果它直接从XYZ到sRGB,我会感到惊讶。非常好的链接(Bruce Lindbloom的链接)顺便说一句。现在我有线性RGB值,但他们的ICC配置文件是什么?我需要输入数据的ICC配置文件,是CIERGB.ICC吗?我使用Little CMS库编辑了我的问题,在那里我描述了其他问题…尝试将
cmsFLAGS_BLACKPOINTCOMPENSATION
标志作为
cmsCreateTransform
的最后一个参数,以启用LittleCMS中的黑点补偿。这不是默认值。我不知道该信任谁。至少LittleCMS是开源的,你可以确切地看到里面发生了什么。有了这个标志,小小的CMS给了我RGB值(42,56,0),这与Photoshop的值非常相似,所以我现在相信它。非常感谢。