4

有谁知道从 linearRGB 颜色(不是 sRGB 颜色)中获取 HSL 的方法?我见过很多 sRGB<->HSL 转换,但没有看到 linearRGB<->HSL。不确定这是否是基本相同的转换,但我会很感激有人对此有任何见解。

线性 RGB 与线性化 sRGB 不同(取 [0,255] 并使其变为 [0,1])。从/到 sRGB 的线性 RGB 转换位于http://en.wikipedia.org/wiki/SRGB。在 VBA 中,这将被表示(采用线性化 sRGB 值 [0,1]):

Public Function sRGB_to_linearRGB(value As Double)
   If value < 0# Then
      sRGB_to_linearRGB = 0#
      Exit Function
   End If
   If value <= 0.04045 Then
      sRGB_to_linearRGB = value / 12.92
      Exit Function
   End If
   If value <= 1# Then
      sRGB_to_linearRGB = ((value + 0.055) / 1.055) ^ 2.4
      Exit Function
   End If
   sRGB_to_linearRGB = 1#
End Function

Public Function linearRGB_to_sRGB(value As Double)
   If value < 0# Then
      linearRGB_to_sRGB = 0#
      Exit Function
   End If
   If value <= 0.0031308 Then
      linearRGB_to_sRGB = value * 12.92
      Exit Function
   End If
   If value < 1# Then
      linearRGB_to_sRGB = 1.055 * (value ^ (1# / 2.4)) - 0.055
      Exit Function
   End If
   linearRGB_to_sRGB = 1#
End Function

我尝试将线性 RGB 值发送到标准 RGB_to_HSL 例程并从 HSL_to_RGB 退出,但它不起作用。可能是因为当前的 HSL<->RGB 算法考虑了伽马校正,而线性 RGB 没有经过伽马校正 - 我不确切知道。我几乎没有看到可以做到这一点的参考资料,除了两个:

  1. http://en.wikipedia.org/wiki/HSL_and_HSV#cite_note-9上的参考资料 (编号为第 10 项)。
  2. 开源项目 Grafx2 @ http://code.google.com/p/grafx2/issues/detail?id=63#c22 的参考,其中贡献者声明他已经完成了线性 RGB <-> HSL 转换并提供.diff 文件中他的评论的附件中的一些 C 代码(我无法真正阅读:()

我的意图是:

  1. 从 sRGB(例如 FF99FF( R=255, G=153, B=255))发送到线性 RGB ( R=1.0, G=0.318546778125092, B=1.0)
    • 使用上面的代码(例如,G=153 将在线性 RGB 中从 获得sRGB_to_linearRGB(153 / 255)
  2. 到 HSL
  3. 将饱和度修改/调制 350%
  4. 从 HSL->Linear RGB->sRGB 发回,结果为 FF19FF( R=255, G=25, B=255)。

使用来自 .NET 的可用函数,例如.getHue来自 a 的System.Drawing.Color函数在任何 HSL 值的 100% 调制以上的任何 sRGB 空间中都不起作用,因此需要发送线性 RGB 而不是 sRGB。

4

4 回答 4

4

转换为线性 RGB 没有多大意义,因为 HSL 是根据伽马编码值定义的。相反,编写您自己的函数将 sRGB 转换为 HSL,使用这些值调制饱和度(允许可能超出色域的饱和度值),然后转换回 sRGB,钳制超出 sRGB 范围的强度(或禁止饱和度更改不能以 sRGB 编码)。

于 2010-04-18T17:31:50.060 回答
1

System.Windows.Media.Color类允许您通过 ScA、ScR、ScG、ScB 属性获取或设置 scRGB,或通过 A、R、G、B 属性获取或设置 RGB。

因此,您可以将 RGB 转换为 HSL,对其进行操作,然后转换回 RGB 并存储在 Color 实例中。然后,您可以读出转换后的 scRGB 属性。

不理想,并且可能涉及一些信息丢失。但这是一个选择!

于 2009-09-28T07:41:50.157 回答
1

根据您在此处的评论,您的问题不是转换错误;这是您对量化值执行连续转换。换句话说,您正在获取 sRGB=>RGB=>HSL=>HSL=>RGB=>sRGB 的结果,并将其用于后续颜色操作。保持精度最直接的方法是始终保持在原始 RGB 值附近并累积要应用的 HSL 空间中的变化。这样,您始终将 HSL 空间操作应用于原始颜色,而不必担心重复处理量化值。

于 2010-04-16T00:05:03.867 回答
1

有帮助吗?该问题中有很多有趣的链接,也许对您的情况也有用...

于 2010-04-18T18:02:21.023 回答