linearRGB与HSL的转换

有没有人知道从线性RGB颜色(不是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; - > RGB算法解释了伽马校正而线性RGB没有经过伽马校正 - 我不确切知道。我已经看到几乎没有引用可以做到这一点,除了两个: 参考 http://en.wikipedia.org/wiki/HSL_and_HSV#cite_note-9 (编号项目10)。 关于开源的参考 项目Grafx2 @ http://code.google.com/p/grafx2/issues/detail?id=63#c22 贡献者指出这一点 他做过线性RGB&lt; - > HSL 转换并在.diff文件中对其注释的附件中提供一些C代码 (我无法真正阅读:() 我的意图是: 从sRGB发送(例如,
FF99FF
R=255, G=153, B=255
))到 线性RGB(
R=1.0,
G=0.318546778125092, B=1.0
) 使用上面的代码(例如, G = 153将在线性中获得 来自
sRGB_to_linearRGB(153 /
255)
的RGB) 到HSL 修改/调整饱和度 350% 从HSL->线性发回 RGB-> sRGB,结果就是
FF19FF
R=255, G=25, B=255
)。 使用.NET中的可用功能,例如来自
System.Drawing.Color
.getHue
,在任何HSL值的100%调制以上的任何sRGB空间中都不起作用,因此需要发送线性RGB而不是sRGB。     
已邀请:
转换为线性RGB没有多大意义,因为HSL是根据伽马编码值定义的。相反,编写自己的函数将sRGB转换为HSL,用这些值调整饱和度(允许可能超出色域饱和度值),然后转换回sRGB,超出sRGB范围的钳位强度(或不允许饱和度变化无法在sRGB中编码)。     
System.Windows.Media.Color类允许您通过A,R,G,B属性通过ScA,ScR,ScG,ScB属性或RGB获取或设置scRGB。 因此,您可以将RGB转换为HSL,对其进行操作,然后转换回RGB并存储在Color实例中。然后,您可以读出转换后的scRGB属性。 不理想,可能会导致一些信息丢失。但这是一个选择!     
根据您在此处的评论,您的问题不是错误地进行转换;这是你在量化值上进行连续转换。换句话说,您正在获取sRGB => RGB => HSL => HSL => RGB => sRGB的结果,并在后续的颜色操作中使用它。保持精度的最直接方法是始终保持原始RGB值并累积要应用的HSL空间中的更改。这样,您始终将HSL空间操作应用于原始颜色,并且您不必担心重复处理量化值。     
这有帮助吗?这个问题中有很多有趣的链接,也许在你的情况下也适用的东西......     

要回复问题请先登录注册