我想将十六进制颜色代码转换为合适的字符串颜色名称...使用以下代码我能够获得"最常用的"的十六进制代码。照片中的颜色:
class ColorMath
{
public static string getDominantColor(Bitmap bmp)
{
//Used for tally
int r = 0;
int g = 0;
int b = 0;
int total = 0;
for (int x = 0; x < bmp.Width; x++)
{
for (int y = 0; y < bmp.Height; y++)
{
Color clr = bmp.GetPixel(x, y);
r += clr.R;
g += clr.G;
b += clr.B;
total++;
}
}
//Calculate average
r /= total;
g /= total;
b /= total;
Color myColor = Color.FromArgb(r, g, b);
string hex = myColor.R.ToString("X2") + myColor.G.ToString("X2") + myColor.B.ToString("X2");
return hex;
}
}
所以我想要一个像这样的十六进制代码:#3A322B看起来像&#34;深褐色&#34;
答案 0 :(得分:2)
假设颜色在KnownColor
枚举中,您可以使用ToKnownColor
:
KnownColor knownColor = color.ToKnownColor();
要注意MSDN文档中的以下内容:
当ToKnownColor方法应用于使用FromArgb方法创建的Color结构时,即使ARGB值与预定义颜色的ARGB值匹配,ToKnownColor也会返回0。
为了获得你的颜色,你可以使用十六进制代码中的以下内容:
Color color = (Color)new ColorConverter().ConvertFromString(htmlString);
htmlString
的格式为#RRGGBB
。
要将KnownColor
转换为字符串,只需在枚举(see here)上使用ToString
:
string name = knownColor.ToString();
将所有这些放在一起就可以使用这种方法:
string GetColourName(string htmlString)
{
Color color = (Color)new ColorConverter().ConvertFromString(htmlString);
KnownColor knownColor = color.ToKnownColor();
string name = knownColor.ToString();
return name.Equals("0") ? "Unknown" : name;
}
称之为:
string name = GetColourName("#00FF00");
Lime
中的结果。
我还发现answer类似的问题看起来效果也很好,它使用反射并回退到html颜色名称:
string GetColorName(Color color) { var colorProperties = typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static) .Where(p => p.PropertyType == typeof(Color)); foreach (var colorProperty in colorProperties) { var colorPropertyValue = (Color)colorProperty.GetValue(null, null); if (colorPropertyValue.R == color.R && colorPropertyValue.G == color.G && colorPropertyValue.B == color.B) { return colorPropertyValue.Name; } } //If unknown color, fallback to the hex value //(or you could return null, "Unkown" or whatever you want) return ColorTranslator.ToHtml(color); }