2009-09-28 109 views
4

有谁知道从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]取):LinearRGB转换为/从HSL

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 

我试图从HSL_to_RGB线性RGB值标准RGB_to_HSL程序发送和退了出去,但它不起作用。也许是因为目前的HSL < - > RGB算法解释了伽玛校正,而线性RGB不是伽玛校正 - 我不知道。我所看到的几乎没有提及,这是可以完成的,除了两个:

  1. 参考上 http://en.wikipedia.org/wiki/HSL_and_HSV#cite_note-9 (编号为第10项)。
  2. @ http://code.google.com/p/grafx2/issues/detail?id=63#c22 一个开源项目 一个Grafx2引用其中的贡献者指出 他做线性RGB < - > HSL 转换,并在为.diff文件提供的附件中他的评论一些C代码 (我真的不能阅读:()

我的意图是:

  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-> Linear RGB-> sRGB发回,结果为 FF19FFR=255, G=25, B=255)。

使用从.NET如.getHueSystem.Drawing.Color可用的功能,在上述任意HSL值的100%调制,因此需要进行线性RGB任何sRGB空间不工作,以代替sRGB而发送。

+0

400代表赏金!! ??哇靠! – 2012-11-17 20:55:44

回答

4

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

+0

嗯......你可能会做点什么,我根本就没有想过这个。让我试试看,我会回来的结果。 – 2010-04-18 19:13:58

+0

单程测试正在使用这个想法!大!现在测试多个通行证。 – 2010-04-18 23:38:02

+0

呃,这个伎俩 - 非常感谢ergosys! – 2010-04-19 05:39:02

1

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

所以你可以将RGB转换为HSL,操纵它,然后转换回RGB并存储在Color实例中。然后您可以读出转换后的scRGB属性。

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

+0

谢谢。我已经研究了这种可能性,主要的问题是每当我到达RGB时我都会失去一点颜色,然后再回来,因为我将在计算之上进行多次计算。例如,我需要将亮度设置为新的亮度,然后根据输入变量更改饱和度,然后用白色着色。进出RGB,我发现我失去了确切的价值。 – 2009-09-28 14:37:20

+0

你有没有什么非.NET。 C++也许? – 2012-11-17 20:56:26

1

基于您的评论here,你的问题是不是做转换错误;这是你正在执行量化值的连续转换。换句话说,您将采用sRGB => RGB => HSL => HSL => RGB => sRGB的结果,并在随后的颜色操作中使用它。保持精度的最直接的方法是始终保持原始RGB值,并在希望应用的HSL空间中累积更改。这样,您始终将HSL空间操作应用于原始颜色,您不必担心重复处理量化值。

+0

谢谢你的想法,但不,scRGB不是我在这里找的。其次,System.Windows.Media.Color没有从/到方法的任何HSL转换。 – 2010-04-16 03:11:52

+0

@Otaku,那不是我的观点。我的观点是,如果您要执行从sRGB到HSL的额外转换并返回,则需要保留更高精度格式的中间结果(Short,Int,Single,Double等)或将所有转换应用于HSL空间一次。 – MSN 2010-04-16 17:19:05

+0

我想我并不完全关注你。线性RGB是Double(根据上面的代码),即数据将保存在HSL和sRGB之间的位置。我不确定我在这里有什么误解。 – 2010-04-16 18:37:02

1

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

+0

这里有一些很好的链接,其中一个我要加书签,但毫无疑问,没有很多关于我之后的解释。 – 2010-04-18 19:13:00