Colors 与HSL之间的linearRGB转换

Colors 与HSL之间的linearRGB转换,colors,hsl,srgb,Colors,Hsl,Srgb,有人知道从linearRGB颜色(不是sRGB颜色)获取HSL的方法吗?我见过很多sRGBHSL转换,但linearRGBHSL没有。不确定它是否基本上是相同的转换,只是有一些小的调整,但我希望有人能对此有所了解 线性RGB与线性化sRGB不同(采用[0255]并使其成为[0,1])。从/到sRGB的线性RGB转换处于。在VBA中,这将表示为(采用线性化的sRGB值[0,1]): 公共函数sRGB\u到\u linearRGB(值为双精度) 如果值sRGB,结果将是 FF19FF(R=255,G

有人知道从linearRGB颜色(不是sRGB颜色)获取HSL的方法吗?我见过很多sRGBHSL转换,但linearRGBHSL没有。不确定它是否基本上是相同的转换,只是有一些小的调整,但我希望有人能对此有所了解

线性RGB与线性化sRGB不同(采用[0255]并使其成为[0,1])。从/到sRGB的线性RGB转换处于。在VBA中,这将表示为(采用线性化的sRGB值[0,1]):

公共函数sRGB\u到\u linearRGB(值为双精度)
如果值<0#则
sRGB_至_linearRGB=0#
退出功能
如果结束
如果值是线性的
RGB->sRGB,结果将是
FF19FF
R=255,G=25,B=255
) 使用.NET中的可用函数,例如
系统中的
.getHue
。Drawing.Color
在任何sRGB空间中都无法工作,超过任何HSL值的100%调制,因此需要发送线性RGB而不是sRGB。

该类允许您通过ScA、ScR、ScG、ScB属性或通过a、R、G、G、S、S、S、S、S、S、S、S、S、S、S、S、S、S、S、S、S、S、S、S、S、S、S、S、S、S、S、S、S,B财产

因此,您可以将RGB转换为HSL,对其进行操作,然后再转换回RGB并存储在颜色实例中。然后可以读取转换后的scRGB属性


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

根据您的评论,您的问题没有进行错误的转换;这是因为您正在对量化值执行连续转换。换句话说,您将获取sRGB=>RGB=>HSL=>HSL=>RGB=>sRGB的结果,并在后续的颜色操作中使用该结果。保持精度最直接的方法是始终保持原始RGB值,并在HSL空间中累积要应用的更改。这样,您总是将HSL空间操作应用于原始颜色,并且不必担心重复处理量化值。

转换为线性RGB没有多大意义,因为HSL是根据伽马编码值定义的。相反,您可以编写自己的函数将sRGB转换为HSL,用这些值调制饱和度(允许潜在的色域外饱和度值),然后转换回sRGB,钳制超出sRGB范围的强度(或禁止无法在sRGB中编码的饱和度更改)

有帮助吗?在这个问题上有很多有趣的链接,也许在你的案例中也有用…

谢谢。我已经考虑过这种可能性,主要的问题是每次我到RGB时都会失去一点颜色,然后再回来,因为我会在计算的基础上进行多次计算。例如,我需要将亮度设置为新的亮度,然后根据输入变量更改饱和度,然后用白色着色。进出RGB时,我发现我丢失了精确的值。你有什么非.NET的吗。也许C++?谢谢你的想法,但是,不,SCRGB不是我在这里寻找的。其次,System.Windows.Media.Color没有从/到方法的任何HSL转换。@Otaku,这不是我的观点。我的观点是,如果您要执行从sRGB到HSL再到HSL的其他转换,您需要以更高精度的格式(Short、Int、Single、Double等)保留中间结果,或者一次在HSL空间中应用所有转换。我想我没有完全明白您的意思。线性RGB是双精度的(根据上面的代码),即数据将保持在HSL和sRGB之间。我不确定我在这里误解了什么。@Otaku,你在另一条评论中提到“进出RGB我发现我丢失了确切的值”。我假设从线性RGB(双精度)到sRGB(字节)。如果你这样做,然后回到线性RGB,你会失去精度。对不起,那是6个多月前的事了,从那时起,线程已经被显著地编辑过了。您可以查看线程的历史记录以查看一些差异。你应该用现在的问题来提供任何可能的解决方案。这里有一些很好的链接,我将把其中的一个添加到书签中,但不幸的是,没有太多关于我想要什么的解释。嗯……你可能知道了一些事,我根本没有想到这一点。让我试一试,我会带着结果回来的。单次通过测试就是用这个想法!伟大的正在测试多次通过。400次重复奖励!!??天哪!
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