none
Color構造体のミス GetSaturationとGetBrightnessの返値がおかしい。 RRS feed

  • 質問

  • ミスの指摘にしては確認がいいかげんかもね。(指摘していただけると有り難いです。)

    Color構造体
    https://msdn.microsoft.com/ja-jp/library/system.drawing.color(v=vs.110).aspx

    「Gets the hue-saturation-brightness (HSB)」関連のメッソドの返値がおかしいです。

      Color  color1 = Color.FromArgb(255, 228, 172, 38);
      float hue = color1.GetHue();  // 42.3157921
      // The hue is measured in degrees, ranging from 0.0 through 360.0, in HSB color space.
      float saturation = color1.GetSaturation(); // 0.77868855
      // The saturation ranges from 0.0 through 1.0, where 0.0 is grayscale and 1.0 is the most saturated.
      float brightness = color1.GetBrightness(); // 0.521568656
      // The brightness ranges from 0.0 through 1.0, where 0.0 represents black and 1.0 represents white.

    GetHue()=42°はいいのですが、GetSaturation()=78%とGetBrightness()=52%がダメです。
    HSBの値ではありません。

    画像をアップできるようにしていただけないでしょうか。

    Windows 10 Pro 64bit
    Microsoft Visual Studio Community 2017 Version 15.3.5

    (.NET Framework 1.1 の頃から放置されているのではないかな。)

    2017年9月29日 10:30

回答

  • HSLの値が返っているようですね。しかし、Visual Studioのドキュメントでは誤って「hue-saturation-brightness (HSB)」と説明している、ということかと。

    ちなみに、PowerPointの「色の設定」ダイアログもColor構造体のメンバー関数と一貫性のある数値を返しますが(ただし、最大値が異なる)、カラーモデルの選択肢は「RGB」と「HSL」と表示されますね。

    • 編集済み 外池 2017年9月29日 11:52
    • 回答としてマーク ery srow 2017年9月29日 12:31
    2017年9月29日 11:46
  • (.NET Framework 1.1 の頃から放置されているのではないかな。)

    ほんと誰も指摘する人がいなかったんですかねぇ…私は色空間に詳しくないのでこの違いを知りませんでした orz

    なお、.NET Coreの開発においてHSB / HSLの違いについて指摘されており、「本当はメソッド名をGetLightnessに変えたいところだが互換性を考慮してHSLである旨をドキュメントで言及すべき」という方向で進んでいるようです。

    .NET Framework / .NET Coreのドキュメントの再編が進められており、System.Drawing.Colorも用意されていますが、.NET 1.1時代の記述のままです。今後、ここが更新されることと思います。またgithubアカウントをお持ちであればご自身で更新しPRすることも可能です。

    • 回答としてマーク ery srow 2017年9月30日 1:46
    2017年9月29日 21:16

すべての返信

  • HSLの値が返っているようですね。しかし、Visual Studioのドキュメントでは誤って「hue-saturation-brightness (HSB)」と説明している、ということかと。

    ちなみに、PowerPointの「色の設定」ダイアログもColor構造体のメンバー関数と一貫性のある数値を返しますが(ただし、最大値が異なる)、カラーモデルの選択肢は「RGB」と「HSL」と表示されますね。

    • 編集済み 外池 2017年9月29日 11:52
    • 回答としてマーク ery srow 2017年9月29日 12:31
    2017年9月29日 11:46
  • そうですね。

    ただ、HueはHSBで計算されて、GetSaturationとGetBrightnessがHLS色空間(= HSL)で計算されているのがおかしいです。

    私が使っているPhotoshopではRGBとHSB(=HSV)がカラーピッカーに使われています。
    それによるとHSBは(42°, 83%, 89%)です。

    2017年9月29日 12:11
  • (.NET Framework 1.1 の頃から放置されているのではないかな。)

    ほんと誰も指摘する人がいなかったんですかねぇ…私は色空間に詳しくないのでこの違いを知りませんでした orz

    なお、.NET Coreの開発においてHSB / HSLの違いについて指摘されており、「本当はメソッド名をGetLightnessに変えたいところだが互換性を考慮してHSLである旨をドキュメントで言及すべき」という方向で進んでいるようです。

    .NET Framework / .NET Coreのドキュメントの再編が進められており、System.Drawing.Colorも用意されていますが、.NET 1.1時代の記述のままです。今後、ここが更新されることと思います。またgithubアカウントをお持ちであればご自身で更新しPRすることも可能です。

    • 回答としてマーク ery srow 2017年9月30日 1:46
    2017年9月29日 21:16
  • お二人からご返事を頂きましたので、気になっていたことを調べ直してみました。
    ひょっとしてHSBのHue(色相)とHSLのHueは同じ計算式ではないかということです

    Wikipediaの「HLS色空間」と「HSV色空間」に変換式が載っていて
    どうも同じです(重ね合わせてみないとわからない)。えへへ...

    2017年9月30日 1:45
  • ery srow さま よろしく。

    本件、面白く拝見しました。  間違いがあったのですね。  びっくりです。

    さて、HSV HSL で検索すると色々なページが Hit しますが、以下が良く纏まっています。 英語なのが残念ですが。

    https://en.wikipedia.org/wiki/HSL_and_HSV

    この事から、 標準クラスを使わずに、独自にクラスを実装した方が良さそうな感触を持っています。

    • 編集済み ShiroYuki_Mot 2017年9月30日 2:57 クラス作成のお勧め
    2017年9月30日 2:35
  • こんにちは。HSV/HSLを使う人ってどういう人でしょうね。画像処理ですかね。
    ボクチンの結末を書いておきます。基本色(その都度変わります)を中心に、
    colorLightLight
    colorLight
    colorBase(基本色 228, 172, 38)
    colorDark
    colorDarkDark
    の4色を作りたくて(C#にはSystemColors.ControlDarkDarkというようなのがありますが少し用途が違います)時間を掛けて調べた結果、

    等差式(248, 192, 58)単純に20ずつ加算、ただし255で頭打ち。
    等比式(248, 233, 199)= (228+20, 172+61, 38+161)
    の二つがあることが分かりました。両方ともr >= g >= b の関係は保たれています。
    (上の場合は到達点が(255, 255, 255)ですが、到達点が(153, 147, 255)というような場合は断然等比式でグラデーションを作るときの方式です。)

    ただなんとなく手抜きされたような感じがして、いっそうのこと
    RGB -> HSBに変換 -> Hueを保ってS,Bを調節して明るく -> RGBに変換
    というような方式を考えてモタモタしていました。
    YIQの「Y(輝度) = 0.299R + 0.587G + 0.114B」というような考え方も使ってみようと思ったり。

    とにかく答えを出す必要がありますのでアルゴリズムを考えざるを得ないのですが、なんか面倒になってしまって。私の場合は効果色(枠線)として使いますのでもうどうでもいいんだ。(等差式でやってみます。)

    画像関連で こんなやり方があったのかと驚いたものとして、(両方とも使ったことはないけれど)
    .NET Frameworkクラスライブラリを用いてビットマップの明るさを変える
    http://mag.autumn.org/Content.modf?id=20060208182549

    イメージを回転、反転、および傾斜させる
    https://msdn.microsoft.com/ja-jp/library/3b575a03(v=vs.110).aspx
    (Image.RotateFlip メソッドとは違うやり方です)

    2017年10月1日 3:40