我希望在Android/iPhone移动设备上显示正确的颜色,所以我为每个设备创建了一个ICC配置文件。我的颜色以L*a*b*(CIELAB)格式给出。从L*a*b*到RGB的转换通过XYZ颜色空间进行,并且我使用Bruce Lindbloom网站上的数学方法。
问题是,将XYZ转换为RGB的算法(不仅仅是Lindbloom网站上的),会直接将其转换为sRGB配置文件。然后我从sRGB转换为我的设备的ICC配置文件(我使用来自www.color.org的'SampleICC'库)。是否有一种方法可以直接将XYZ值转换为我的设备配置文件并跳过sRGB,最好使用SampleICC库,或者是否有任何其他应用ICC配置文件的C/C++库?...带有文档和/或示例。我希望可以获得更高的精度。
编辑: 根据@Nikita Nemkin的建议,我尝试了Little CMS,在那里我使用了内置的Lab配置文件,并创建了以下转换:
问题是,将XYZ转换为RGB的算法(不仅仅是Lindbloom网站上的),会直接将其转换为sRGB配置文件。然后我从sRGB转换为我的设备的ICC配置文件(我使用来自www.color.org的'SampleICC'库)。是否有一种方法可以直接将XYZ值转换为我的设备配置文件并跳过sRGB,最好使用SampleICC库,或者是否有任何其他应用ICC配置文件的C/C++库?...带有文档和/或示例。我希望可以获得更高的精度。
编辑: 根据@Nikita Nemkin的建议,我尝试了Little CMS,在那里我使用了内置的Lab配置文件,并创建了以下转换:
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%可靠的软件来检查我的值?