尝试将rgb从.net颜色转换为字符串,如“红色”或“蓝色”

我的所有方法都以各种方式让我失望。 不同的灯光也会把它搞得一团糟。

有没有人试图返回一个rgb值的名称? “红色”“绿色”“蓝色”足以满足我今天的需求。

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

网络摄像头http://i35.tinypic.com/2yvorau.png

颜色

如果你有一个带名字的已知颜色列表,你可以看到给定目标颜色中哪些已知颜色“最接近”,使用沿着(F#代码)行的“接近”function:

let Diff (c1:Color) (c2:Color) = let dr = (c1.R - c2.R) |> int let dg = (c1.G - c2.G) |> int let db = (c1.B - c2.B) |> int dr*dr + dg*dg + db*db 

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

您可以尝试此代码

 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); } 

我个人觉得从色调/饱和度/亮度方面考虑颜色比RGB值更自然,我认为在这种情况下这对你很有用。 试试这个:

根据您的需要,为某些光谱范围指定颜色名称。 例如,红色可能是0-39,橙色是40-79等等(那些是任意数字 – 我不知道它们是否适合任何规模)。 然后根据您的RGB值计算色调(您可以在这里找到一个公式,尽管可能还有其他公式)。 一旦你知道了色调,就会知道它所处的光谱范围,你可以给它命名。

那么,红色/绿色/蓝色很容易通过检查来识别; 您需要支持哪些值?

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

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

  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); 

您也可以将此方法用作更复杂算法的已知颜色的来源。

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

 string ColorName(Color c) { List hues = new List() { 0, 15, 35, 44, 54, 63, 80, 160, 180, 200, 244, 280, 350, 360}; List hueNames = new List() { "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 = (cR * 0.299f + cG * 0.587f + cB *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; } 

如果你想让蓝调更加与众不同,你可以很容易地适应它。