有谁知道从 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 没有经过伽马校正 - 我不确切知道。我几乎没有看到可以做到这一点的参考资料,除了两个:
- 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 <-> HSL 转换并提供.diff 文件中他的评论的附件中的一些 C 代码(我无法真正阅读:()
我的意图是:
- 从 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)
)
- 使用上面的代码(例如,G=153 将在线性 RGB 中从 获得
- 到 HSL
- 将饱和度修改/调制 350%
- 从 HSL->Linear RGB->sRGB 发回,结果为
FF19FF
(R=255, G=25, B=255
)。
使用来自 .NET 的可用函数,例如.getHue
来自 a 的System.Drawing.Color
函数在任何 HSL 值的 100% 调制以上的任何 sRGB 空间中都不起作用,因此需要发送线性 RGB 而不是 sRGB。