linearRGB转换为HSL或从HSL转换

时间:2009-09-28 07:13:10

标签: colors hsl srgb

有没有人知道从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&lt; - &gt; 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&lt; - &gt; HSL 转换并在.diff文件中对其注释的附件中提供一些C代码 (我无法真正阅读:()
  3. 我的意图是:

    1. 从sRGB发送(例如, FF99FFR=255, G=153, B=255)) 线性RGB(R=1.0, G=0.318546778125092, B=1.0
      • 使用上面的代码(例如, G = 153将在线性中获得 来自sRGB_to_linearRGB(153 / 255))的RGB
    2. 到HSL
    3. 修改/调整饱和度 350%
    4. 从HSL发回|&gt;线性 RGB-> sRGB,结果就是 FF19FFR=255, G=25, B=255)。
    5. 使用.NET中的可用函数,例如来自.getHue的{​​{1}}在任何HSR值的100%调制以上的任何sRGB空间中都不起作用,因此需要发送线性RGB而不是sRGB。

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

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

不理想,可能会导致一些信息丢失。但这是一个选择!

答案 2 :(得分:1)

根据您的评论here,您的问题不是错误地进行转换;这是你在量化值上进行连续转换。换句话说,您正在获取sRGB =&gt; RGB =&gt; HSL =&gt; HSL =&gt; RGB =&gt; sRGB的结果,并在后续的颜色操作中使用它。保持精度的最直接方法是始终保持原始RGB值并累积要应用的HSL空间中的更改。这样,您始终将HSL空间操作应用于原始颜色,并且您不必担心重复处理量化值。

答案 3 :(得分:1)

this有帮助吗?这个问题中有很多有趣的链接,也许在你的情况下也适用......