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] を使用):

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つを除いて、これができるという参照はほとんど見たことがありません:

  1. http://en.wikipedia.org/wiki/HSL_and_HSV#cite_note-9 (番号付きアイテム 10)の参照 。
  2. オープン ソース プロジェクト Grafx2 @ http://code.google.com/p/grafx2/issues/detail?id=63#c22に関する参考文献では 、寄稿者が Linear RGB <-> HSL 変換を行ったと述べており、 .diff ファイル内の彼のコメントに添付されたいくつかの C コード (実際には読めません :( )

私の意図は次のとおりです。

  1. 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)) 。
  2. HSLへ
  3. 彩度を 350% 変更/変調します。
  4. HSL->Linear RGB->sRGB から送り返すと、結果は FF19FF( R=255, G=25, B=255) になります。

.getHueaなどの .NET から利用可能な関数を使用するSystem.Drawing.Colorと、任意の HSL 値の 100% 変調を超える sRGB 空間では機能しないため、sRGB の代わりにリニア RGB を送信する必要があります。

4

4 に答える 4

4

HSL はガンマでエンコードされた値で定義されているため、リニア RGB に変換してもあまり意味がありません。代わりに、sRGB を HSL に変換する独自の関数を記述し、それらの値で彩度を変調し (色域外の彩度値を許可する可能性があります)、sRGB に戻して、sRGB 範囲外の強度をクランプします (または彩度の変更を許可しません)。 sRGB でエンコードすることはできません)。

于 2010-04-18T17:31:50.060 に答える
1

Based on your comment here, your issue isn't doing the conversion incorrectly; it's that you are performing successive conversions on quantized values. In other words, you are taking the result of sRGB=>RGB=>HSL=>HSL=>RGB=>sRGB and using that in subsequent color operations. The most straightforward way to maintain precision is to always keep around the original RGB value and accumulate the changes in HSL space you want to apply. That way, you are always applying the HSL space operations to the original color and you don't have to worry about repeatedly processing quantized values.

于 2010-04-16T00:05:03.867 に答える
1

System.Windows.Media.Colorクラスを使用すると、 ScA、ScR、ScG、ScBプロパティを介してscRGBを取得または設定したり、A、R、G、Bプロパティを介してRGBを設定したりできます。

したがって、RGBをHSLに変換し、それを操作してから、RGBに変換し直して、Colorインスタンスに保存することができます。次に、変換されたscRGBプロパティを読み取ることができます。

理想的ではなく、情報が失われる可能性があります。しかし、それはオプションです!

于 2009-09-28T07:41:50.157 に答える
1

これは役に立ちますか?その質問には興味深いリンクがたくさんあります。おそらくあなたのケースでもうまくいくでしょう...

于 2010-04-18T18:02:21.023 に答える