【问题标题】:Convert L*a*b* to RGB using an ICC profile使用 ICC 配置文件将 L*a*b* 转换为 RGB
【发布时间】:2013-06-02 06:09:50
【问题描述】:

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

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

编辑: 根据@Nikita Nemkin 的建议,我尝试了使用内置 Lab 配置文件的小型 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 中我使用了黑点补偿和 Adob​​e 引擎。我应该相信哪个号码?是否有任何 100% 可靠的软件来检查我的价值观?

【问题讨论】:

  • 我不确定我理解你想要什么。您想将 XYZ 转换为 RGB 而不是 sRGB?您应该能够在许多地方(例如维基百科)找到执行此操作的公式。无论如何,它应该是一个两步过程 XYZ -> RGB -> sRGB 所以如果它直接从 XYZ 转到 sRGB,我会感到惊讶。
  • 优秀的链接(Bruce Lindbloom 的链接)顺便说一句。
  • 现在我有了线性 RGB 值,但它们的 ICC 配置文件是什么?我需要输入数据的 ICC 配置文件,是 CIERGB.icc 吗?

标签: c++ c colors rgb color-management


【解决方案1】:

Little CMS 是一个流行的开源(MIT 许可)颜色管理库。它应该能够为所欲为。

【讨论】:

  • 我使用 Little CMS 库编辑了我的问题,并在其中描述了其他问题...
  • 尝试将 cmsFLAGS_BLACKPOINTCOMPENSATION 标志作为最后一个参数传递给 cmsCreateTransform 以在 LittleCMS 中启用黑点补偿。它不是默认值。我不知道该相信谁。至少 LittleCMS 是开源的,你可以确切地看到里面发生了什么。
  • 有了那个标志,Little CMS 给了我 RGB 值 (42, 56, 0),这与 Photoshop 的值非常相似,所以我现在相信它。谢谢。
猜你喜欢
  • 2013-08-18
  • 2011-07-11
  • 2014-04-13
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
相关资源
最近更新 更多