トップ回答者
Color構造体のミス GetSaturationとGetBrightnessの返値がおかしい。

質問
-
ミスの指摘にしては確認がいいかげんかもね。(指摘していただけると有り難いです。)
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 の頃から放置されているのではないかな。)
回答
-
(.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
すべての返信
-
(.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
-
ery srow さま よろしく。
本件、面白く拝見しました。 間違いがあったのですね。 びっくりです。
さて、HSV HSL で検索すると色々なページが Hit しますが、以下が良く纏まっています。 英語なのが残念ですが。
https://en.wikipedia.org/wiki/HSL_and_HSV
この事から、 標準クラスを使わずに、独自にクラスを実装した方が良さそうな感触を持っています。
- 編集済み ShiroYuki_Mot 2017年9月30日 2:57 クラス作成のお勧め
-
こんにちは。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 メソッドとは違うやり方です)