0

ゲーム用のコンソールのような GUI を書きたいのですが、実際のコンソールから始めます。だから私は色を指定するクラスを持っています。ここで、consolecolor を rgb (24 ビット) に、またはその逆に変換したいと考えています。私はこれを試しました:

int d = (((int)col & 8) != 0) ? 255 : 128;
r = (((int)col & 4) != 0) ? d : 0;
g = (((int)col & 2) != 0) ? d : 0;
b = (((int)col & 1) != 0) ? d : 0;

4 ビット色には、このビットスキームがあります: drgb。d が 0 の場合、色は暗くなり、1 の場合、RGB 値は 255 になります。私の問題は、私のプログラムでは、色 1000 (明るい黒) と色 0111 (暗い白) が黒と灰色です。それらはダークグレーとライトグレーでなければなりません。また、特定の色を元に戻すだけでなく、丸めを使用して色を元に戻す方法は?

4

3 に答える 3

2

色は、R、G、B の 3 つの座標軸を持つ 3 次元パラメーター空間で定義されます。2 つの色の間の距離は次のように計算できaますb

double dist = Math.Sqrt(Sqr(a.R - b.R) + Sqr(a.G - b.G) + Sqr(a.B - b.B));

この数式はこのメソッドを使用します

private static int Sqr(int x)
{
    return x * x;
}

最も一致する色は、距離が最も小さい色です。距離の比較に距離の 2 乗を使用することもできます (効率のため)。

int sqrDist = Sqr(a.R - b.R) + Sqr(a.G - b.G) + Sqr(a.B - b.B);

次に、コンソールの 16 色の​​配列を定義します。

Color[] consoleColors = new[] {
    Colors.Black,
    Colors.Red,
    ...
};

とのベストマッチを得る

Color bestMatch;
int bestSqrDist = Int32.MaxValue;
foreach (Color consoleColor in consoleColors) {
    int sqrDist = Sqr(theColor.R - consoleColor.R) +
                  Sqr(theColor.G - consoleColor.G) +
                  Sqr(theColor.B - consoleColor.B);
    if (sqrDist < bestSqrDist) {
        bestMatch = consoleColor;
        bestSqrDist = sqrDist;
    }
}
于 2014-05-24T15:36:26.523 に答える
1

私があなたを正しく理解したかどうかはわかりませんが、これを試してください:

    int d = (((int)col & 8) != 0) ? 64 : 0;
    r = (((int)col & 4) != 0) ? d + 191 : d;
    g = (((int)col & 2) != 0) ? d + 191 : d;
    b = (((int)col & 1) != 0) ? d + 191 : d;
于 2014-05-24T15:24:05.363 に答える