有谁知道从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
贡献者在其中指出
他完成了Linear RGB 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中可用的功能,例如
.getHue
中的System.Drawing.Color
在大于任何HSL值100%调制的任何sRGB空间中均不起作用,因此需要发送线性RGB而不是sRGB。 最佳答案
转换为线性RGB并没有多大意义,因为HSL是根据伽玛编码值定义的。而是编写自己的函数,将sRGB转换为HSL,用这些值调制饱和度(允许潜在的色域外饱和度值),然后再转换回sRGB,钳制sRGB范围之外的强度(或不允许进行饱和度变化)无法以sRGB编码)。