WPFのColor
構造体で動作するメソッドを記述して、Color
の色相を表すバイトを返すようにしています。私は式に苦しんでいる、私は黒の色(255,255,255)、赤(255,0,0)、緑(0,255,0)、青(0,0,255)の単体テストを書いている。黄色(255,255,0)、シアン(0,255,255)、マゼンタ(255,0255)、白(255,255,255) - イエロー(42 )とMagenta(212の代わりに-1を返しますが、-1として失敗するとバイトにキャストされません)。次のようにため色の色相を0から255の範囲として計算する
マイ拡張メソッドが表示されます
public static byte GetHue(this Color color)
=> GetHue(color.ToRgbDictionary(), color.GetMinComponent(), color.GetMaxComponent());
private static byte GetHue(Dictionary<ColorComponent, byte> rgbDictionary, ColorComponent minimumRgbComponent, ColorComponent maximumRgbComponent)
{
decimal chroma = rgbDictionary[maximumRgbComponent] - rgbDictionary[minimumRgbComponent];
return (byte)
(
chroma == 0
? 0
: thirdOfByte
* (byte)maximumRgbComponent
+
(
rgbDictionary[MathHelper.Wrap(maximumRgbComponent + 1)]
- rgbDictionary[MathHelper.Wrap(maximumRgbComponent - 1)]
)
/chroma
);
}
ToRgbDictionary
は単に、赤、緑、青の成分の辞書にColor
を回します。 ColorComponent
は、これらのコンポーネントのキーとして使用される列挙型です。 MathHelper.Wrap
は、オーバーフローまたはアンダーフローの場合に、宣言された範囲に列挙型を戻す方法です。 GetMinComponent
とGetMaxComponent
はColor
の2つの拡張メソッドで、Color
(ColorComponent
の順番は、赤、緑、青)の最初の最低値と最初の最高値であるColorComponent
を返します。 thirdOfByte
は、byte.MaxValue/3
に等しい定数です。
私はベースしている。このようになります。私はここで見つける別()でこの式:
private decimal GetH(RGB rgb, decimal max, decimal chroma)
{
decimal h;
if (rgb.R == max)
h = ((rgb.G - rgb.B)/chroma);
else if (rgb.G == max)
h = ((rgb.B - rgb.R)/chroma) + 2M;
else
h = ((rgb.R - rgb.G)/chroma) + 4M;
return 60M * ((h + 6M) % 6M);
}
、式での問題は、それが0にマッピングされていますされて - 360色相範囲ではなく、0から255私が必要とする範囲です。私はこの数式の定数が何をしているのか分かりませんが、60は360/3 = 120と何か関係があると思いますので、同様のことをやろうとする私の3分の1のバイト定数です。 6Mの場合、私は彼らがどこから来たのか、なぜその段階で色相値に追加され、モジュレーションされるのか分かりません。数学の心を持っている人なら誰でも私を助けてくれますか?
UPDATE 0理由 - 255の範囲は、私はそれは色相、彩度、明度のために(図示のように)ソフトウェアの別の部分で使用さ見た必要とされたものをすべてだと思ったことでした。また、私は黄色の42色相値を取得しました。私は現在、16777216(256 * 256 * 256)の色範囲で可能なすべての色相をカバーする色相の正しい範囲を見つけることを試みています。
私は0使用して再考している - 今、あなたはそれを言ったこと255。私は1バイトを節約するために価値の解決を失いたくない!つまり、私は今式をコピーすることができますが、私はそれを理解したいと思います(60M、2台の6M、4M、2Mの意味は何ですか?)。私はモジュラスを仮定します。小数は、その後の乗算(それ以降の丸めが適用される可能性があるため)が重要なためです。 – Sphynx
明確にするために、255 * 255 * 255色の可能な色相の総数、またはこれらの色相を1度あたりの色相円にマッピングする方法がありますか?私は、色相を特定のユーザーコントロールの形にカップリングすることよりも精度が高いです。 – Sphynx