Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# 正在尝试将rgb从.net颜色转换为字符串,例如;“红色”;或;“蓝色”;_C#_.net_Image_Colors_System.drawing.color - Fatal编程技术网

C# 正在尝试将rgb从.net颜色转换为字符串,例如;“红色”;或;“蓝色”;

C# 正在尝试将rgb从.net颜色转换为字符串,例如;“红色”;或;“蓝色”;,c#,.net,image,colors,system.drawing.color,C#,.net,Image,Colors,System.drawing.color,我所有的方法都在不同方面让我失望。 不同的照明也会把事情搞得一团糟 是否有人尝试返回给定rgb值的名称?“红”“绿”“蓝”足以满足我今天的需要 我对网络摄像头中的图像进行了不安全的字节处理 嗯,红色/绿色/蓝色通过检查很容易识别;您需要支持哪些范围的值 问题是,除非你从一个命名的颜色开始,否则很难回到一个IsNamedColor将返回false,即使您通过FromArgb创建了明显的颜色 如果您只需要实际预期的标准颜色,您可以通过反射枚举已知颜色 Color test = C

我所有的方法都在不同方面让我失望。 不同的照明也会把事情搞得一团糟

是否有人尝试返回给定rgb值的名称?“红”“绿”“蓝”足以满足我今天的需要

我对网络摄像头中的图像进行了不安全的字节处理


嗯,红色/绿色/蓝色通过检查很容易识别;您需要支持哪些范围的值

问题是,除非你从一个命名的颜色开始,否则很难回到一个
IsNamedColor
将返回false,即使您通过FromArgb创建了明显的颜色

如果您只需要实际预期的标准颜色,您可以通过反射枚举已知颜色

        Color test = Color.FromArgb(255,0,0);
        Color known = (
                   from prop in typeof(Color)
                       .GetProperties(BindingFlags.Public | BindingFlags.Static)
                   where prop.PropertyType == typeof(Color)
                   let color = (Color)prop.GetValue(null, null)
                   where color.A == test.A && color.R == test.R
                     && color.G == test.G && color.B == test.B
                   select color)
                   .FirstOrDefault();

        Console.WriteLine(known.Name);

您还可以使用此方法作为更复杂算法的已知颜色源。

如果您有一个带有名称的已知颜色列表,您可以使用一个“贴近度”函数,沿着(F#代码)行查看给定目标颜色“最接近”的已知颜色:


无论哪种已知颜色与您想要命名的目标颜色之间的差异最小,请使用该名称。

我个人认为,从颜色角度来考虑颜色比从RGB值来考虑颜色更自然,我认为在这种情况下,这对您来说会很好。试试这个:

为光谱的特定范围指定颜色名称,如您认为合适。例如,也许红色是0-39,橙色是40-79,等等(这些是任意的数字——我不知道它们是否适合任何类型的刻度)。然后根据RGB值计算色调(您可以找到一个公式,尽管可能还有其他公式)。一旦你知道了色调,你就知道了它的光谱范围,你可以给它起个名字。

你可以试试这个代码

static char[] hexDigits = {
         '0', '1', '2', '3', '4', '5', '6', '7',
         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};



public static string ColorToHexString(Color color)
        {
            byte[] bytes = new byte[4];
            bytes[0] = color.A;
            bytes[1] = color.R;
            bytes[2] = color.G;
            bytes[3] = color.B;
            char[] chars = new char[bytes.Length * 2];
            for (int i = 0; i < bytes.Length; i++)
            {
                int b = bytes[i];
                chars[i * 2] = hexDigits[b >> 4];
                chars[i * 2 + 1] = hexDigits[b & 0xF];
            }
            return new string(chars);
        }
静态字符[]十六进制数字={
'0', '1', '2', '3', '4', '5', '6', '7',
‘8’、‘9’、‘A’、‘B’、‘C’、‘D’、‘E’、‘F’};
公共静态字符串ColorToHexString(彩色)
{
字节[]字节=新字节[4];
字节[0]=color.A;
字节[1]=color.R;
字节[2]=color.G;
字节[3]=color.B;
char[]chars=新字符[bytes.Length*2];
for(int i=0;i>4];
字符[i*2+1]=十六进制数字[b&0xF];
}
返回新字符串(字符);
}

这里是一个简单的名称方案,使用两个限定符和一个颜色名称:

string ColorName(Color c)
{
    List<float> hues = new List<float>()
    { 0, 15, 35, 44, 54, 63, 80, 160, 180, 200, 244, 280, 350, 360};
    List<string> hueNames = new List<string>()
        { "red", "orange-red", "orange", "yellow-orange", "yellow",
          "yellow-green",   "green"  , "blue-green" , "cyan", "blue", 
          "violet", "purple", "red" };

    float h = c.GetHue();
    float s = c.GetSaturation();
    float b = (c.R * 0.299f + c.G * 0.587f + c.B *0.114f) / 256f;

    string name = s < 0.35f ? "pale " : s > 0.8f ? "vivid " : "";
    name += b < 0.35f ? "dark " : b > 0.8f ? "light " : "";
    for (int i = 0; i < hues.Count - 1; i++)
        if (h >= hues[i] && h <= hues[i+1] )
        {
            name += hueNames[i];
            break;
        }
    return name;
}
字符串颜色名称(c色)
{
列表色调=新列表()
{ 0, 15, 35, 44, 54, 63, 80, 160, 180, 200, 244, 280, 350, 360};
List hueNames=新列表()
{“红色”、“橙红色”、“橙色”、“黄橙色”、“黄色”,
“黄绿色”、“绿色”、“蓝绿色”、“青色”、“蓝色”,
“紫罗兰色”、“紫色”、“红色”};
float h=c.GetHue();
浮点数s=c.GetSaturation();
浮点数b=(c.R*0.299f+c.G*0.587f+c.b*0.114f)/256f;
字符串名称=s<0.35f?“苍白”:s>0.8f?“生动”:“;
名称+=b<0.35f?“暗”:b>0.8f?“亮”:“;
for(int i=0;i如果(h>=hues[i]&&h全光谱,我可以从我的网络摄像头进行字节图像处理。标准颜色的一个稍微简单的来源是KnownColors枚举。这样你就不必使用GetProperties等(使用Color.FromKnownColor)因此,这个问题可以重新表述为给定一个颜色和名称的字典,对于给定的颜色,找到最近颜色的名称?这是一段很好的代码。这个解决方案只会给你rgbs差异的最大值。这不是我要问的。我想给出一个颜色并找到接近的颜色。但写下这个,我在脑海中回答了。我会发布cod这是这里唯一的好答案!要找到颜色,HSV和HSL颜色空间是唯一的好选择。你的代码在OpenCV中可能需要5行!
string ColorName(Color c)
{
    List<float> hues = new List<float>()
    { 0, 15, 35, 44, 54, 63, 80, 160, 180, 200, 244, 280, 350, 360};
    List<string> hueNames = new List<string>()
        { "red", "orange-red", "orange", "yellow-orange", "yellow",
          "yellow-green",   "green"  , "blue-green" , "cyan", "blue", 
          "violet", "purple", "red" };

    float h = c.GetHue();
    float s = c.GetSaturation();
    float b = (c.R * 0.299f + c.G * 0.587f + c.B *0.114f) / 256f;

    string name = s < 0.35f ? "pale " : s > 0.8f ? "vivid " : "";
    name += b < 0.35f ? "dark " : b > 0.8f ? "light " : "";
    for (int i = 0; i < hues.Count - 1; i++)
        if (h >= hues[i] && h <= hues[i+1] )
        {
            name += hueNames[i];
            break;
        }
    return name;
}