I was going through the code of CSAH when I came across the class HtmlColor. It does a mapping of r, g, b colors to a name by doing this:
this.color = String.Format("#{0:x2}{1:x2}{2:x2}", r, g, b);
switch (this.color)
{case "#00ffff":
this.color = "aqua";
break;case "#000000":
this.color = "black";
break; // more code
I tried this:
Enum.GetName(typeof(KnownColor), Color.FromArgb(255, r, g, b).ToKnownColor());
Nope.. didn't work! ToKnownColor() was returning zero. A quick lookup in MSDN Documentation proved my worst fears. Unless you create a Color FromName, ToKnownColor() will return zero!
I googled and found this solution. Here's my improved(?) version:
Dictionary<int, string> colorCache = new Dictionary<int, string>();
public string GetKnownColorName(int r, int g, int b)
{int iArgb = Color.FromArgb(r, g, b).ToArgb();
if (this.colorCache.ContainsKey(iArgb))
return this.colorCache[iArgb];
string namedColor = null;
foreach (string name in Enum.GetNames(typeof(KnownColor)))
{Color kc = Color.FromName(name);
if (!kc.IsSystemColor && kc.ToArgb() == iArgb) {namedColor = kc.Name;
this.colorCache.Add(iArgb, namedColor); break;}
}
return namedColor;}
Technorati Tags: Color.ToKnownColor(), CSAH
2 comments:
Thanks. Been hunting high and low for something like this!
Andy
Very nice. Most appreciated
Post a Comment