Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#将4位颜色(=控制台颜色)转换为RGB并返回_C#_Colors_24 Bit - Fatal编程技术网

C#将4位颜色(=控制台颜色)转换为RGB并返回

C#将4位颜色(=控制台颜色)转换为RGB并返回,c#,colors,24-bit,C#,Colors,24 Bit,我想为游戏编写一个类似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

我想为游戏编写一个类似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(深白色)是黑色和灰色的。它们应该是暗灰色和浅灰色的。以及如何通过舍入将颜色转换回来,而不仅仅是将特定颜色转换回来?

我不确定是否正确理解您的意思,但请尝试以下方法:

    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;

我不确定我是否理解正确,但请尝试以下方法:

    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;

浅灰色是特殊情况,您只需单独处理即可

您可以使用颜色的RGB值设置阵列,并使用它们进行转换,当您要将颜色转换回来时,它们将非常方便

将24位颜色转换为16种颜色的调色板可以通过多种不同的方式完成。一种方法是计算RGB颜色和调色板颜色之间的差异,并选择差异最小的颜色:

例如:

byte[] r = { 0, 0, 0, 0, 128, 128, 128, 128, 192, 0, 0, 0, 255, 255, 255, 255 };
byte[] g = { 0, 0, 128, 128, 0, 0, 128, 128, 192, 0, 255, 255, 0, 0, 255, 255 };
byte[] b = { 0, 128, 0, 128, 0, 128, 0, 128, 192, 255, 0, 255, 0, 255, 0, 255 };

Color c = Color.Khaki;
int index = Enumerable.Range(0, 16)
  .OrderBy(i => Math.Abs(c.R - r[i]) + Math.Abs(c.G - g[i]) + Math.Abs(c.B - b[i]))
  .First();

浅灰色是特殊情况,您只需单独处理即可

您可以使用颜色的RGB值设置阵列,并使用它们进行转换,当您要将颜色转换回来时,它们将非常方便

将24位颜色转换为16种颜色的调色板可以通过多种不同的方式完成。一种方法是计算RGB颜色和调色板颜色之间的差异,并选择差异最小的颜色:

例如:

byte[] r = { 0, 0, 0, 0, 128, 128, 128, 128, 192, 0, 0, 0, 255, 255, 255, 255 };
byte[] g = { 0, 0, 128, 128, 0, 0, 128, 128, 192, 0, 255, 255, 0, 0, 255, 255 };
byte[] b = { 0, 128, 0, 128, 0, 128, 0, 128, 192, 255, 0, 255, 0, 255, 0, 255 };

Color c = Color.Khaki;
int index = Enumerable.Range(0, 16)
  .OrderBy(i => Math.Abs(c.R - r[i]) + Math.Abs(c.G - g[i]) + Math.Abs(c.B - b[i]))
  .First();

颜色在三维参数空间中用三个坐标轴R、G和B定义。您可以计算两种颜色
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;
}
最佳匹配颜色是距离最小的颜色。您还可以使用距离的平方来比较距离(为了效率):

现在定义一个具有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;
    }
}
颜色最佳匹配;
int bestSqrDist=Int32.MaxValue;
foreach(控制台颜色中的控制台颜色){
int sqrDist=Sqr(theColor.R-consoleColor.R)+
Sqr(颜色G-控制台颜色G)+
Sqr(颜色B-控制台颜色B);
if(sqrDist
颜色是在三维参数空间中定义的,有三个坐标轴R、G和B。您可以这样计算两种颜色
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;
}
最佳匹配颜色是距离最小的颜色。您还可以使用距离的平方来比较距离(为了效率):

现在定义一个具有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;
    }
}
颜色最佳匹配;
int bestSqrDist=Int32.MaxValue;
foreach(控制台颜色中的控制台颜色){
int sqrDist=Sqr(theColor.R-consoleColor.R)+
Sqr(颜色G-控制台颜色G)+
Sqr(颜色B-控制台颜色B);
if(sqrDist
1000怎么会是黑色以外的东西呢?r、 g和b都是
0
。这就是问题所在。只需输入color/?在窗户里,你会发现它应该是浅灰色的。对于16个值来说,这根本不符合逻辑,编写
开关所需的时间可能比找出正确的映射所需的时间要少。但反过来说,这是不可能的
1000
应该是黑色以外的东西吗?r、 g和b都是
0
。这就是问题所在。只需输入color/?在窗户里,你会发现它应该是浅灰色的。对我来说,这根本不符合逻辑。对于16个值,编写
开关所需的时间可能比找出正确的映射所需的时间要少。但另一种方法是不可能的。注意:这是获得“最佳”匹配颜色的一种方法,而不是唯一的方法。注意:这是获得“最佳”匹配颜色的一种方法,而不是唯一的方法。