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
Linear RGB 値を標準の RGB_to_HSL ルーチンに送信し、HSL_to_RGB から戻そうとしましたが、うまくいきません。おそらく、現在の HSL<->RGB アルゴリズムはガンマ補正を考慮しており、リニア RGB はガンマ補正されていないため、正確にはわかりません。2つを除いて、これができるという参照はほとんど見たことがありません:
- 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
)) から Linear 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
) になります。
.getHue
aなどの .NET から利用可能な関数を使用するSystem.Drawing.Color
と、任意の HSL 値の 100% 変調を超える sRGB 空間では機能しないため、sRGB の代わりにリニア RGB を送信する必要があります。