有没有人知道从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没有进行伽马校正 - 我不确切知道。除了两个之外,我几乎没有看到可以做到这一点的引用:
我的意图是:
FF99FF
(R=255, G=153, B=255
))
线性RGB(R=1.0,
G=0.318546778125092, B=1.0
)
sRGB_to_linearRGB(153 /
255)
)的RGB FF19FF
(R=255, G=25, B=255
)。使用.NET中的可用函数,例如来自.getHue
的{{1}}在任何HSR值的100%调制以上的任何sRGB空间中都不起作用,因此需要发送线性RGB而不是sRGB。
答案 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有帮助吗?这个问题中有很多有趣的链接,也许在你的情况下也适用......