我正在制作一个系统,其中包括使用“colorDialog”选择颜色并将其显示在文本框上。问题是其他颜色显示十六进制值(如 ffff8000)。我怎样才能把它变成可读的文本?
我有一个解决方案:
private string changeColortoReadable(string changedColor){
if(colorDialog.Color.Name == "ffff8000"){
changedColor = "Orange";
}
return changedColor;
}
把所有的十六进制颜色转换成可读的颜色对我来说有点累和耗时。
只获取完美匹配的颜色名称:
您可以使用 KnownColor 枚举来创建所需的查找。见下文:
public static class HexColorTranslator
{
private static Dictionary<string, string> _hex2Name;
private static Dictionary<string, string> Hex2Name
{
get
{
if (_hex2Name == null)
{
_hex2Name = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
foreach (KnownColor ce in typeof(KnownColor).GetEnumValues())
{
var name = ce.ToString();
var color = Color.FromKnownColor(ce);
var hex = HexConverter(color);
_hex2Name[hex] = name;
}
}
return _hex2Name;
}
}
//https://stackoverflow.com/a/2395708/1155329
private static String HexConverter(System.Drawing.Color c)
{
return c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
}
public static string GetKnownColorFromHex(string hex)
{
hex = hex.TrimStart('#');
if (Hex2Name.TryGetValue(hex, out string result)) return result;
return "???";
}
}
通过调用 GetKnownColorFromHex 函数获取颜色:
Console.WriteLine(HexColorTranslator.GetKnownColorFromHex("#ff0000")); // Red
请注意,遗憾的是您不能使用 ToKnownColor,除非该颜色是使用已知颜色创建的。见:
var aquaKnown = Color.FromKnownColor(KnownColor.Aqua);
var aquaUnknown = Color.FromArgb(aquaKnown.A, aquaKnown.R, aquaKnown.G, aquaKnown.B);
Console.WriteLine(aquaKnown.ToKnownColor()); //Aqua
Console.WriteLine(aquaUnknown.ToKnownColor()); //0
在 RGB 空间中获取最接近的颜色的名称:
如果你想获得最接近的颜色,你可以试试这个:
public static string GetNearestKnownColor(string hex)
{
var color = System.Drawing.ColorTranslator.FromHtml(hex);
double bestSquared = double.MaxValue;
KnownColor bestMatch = default(KnownColor);
foreach (KnownColor ce in typeof(KnownColor).GetEnumValues())
{
Color tryColor = Color.FromKnownColor(ce);
double deltaR = tryColor.R - color.R;
double deltaG = tryColor.G - color.G;
double deltaB = tryColor.B - color.B;
double squared = deltaR * deltaR + deltaG * deltaG + deltaB * deltaB;
if(squared == 0) return ce.ToString();
if (squared < bestSquared)
{
bestMatch = ce;
bestSquared = squared;
}
}
return bestMatch.ToString();
}
请注意,这并不完全准确,因为它在 RGB 空间中运行,这可能会产生不同于人类可能对颜色进行分类的结果。