Why is Color.IsNamedColor not working when I create a color using Color.FromArgb ()?
In my application, I allow the user to create a color and then show him the name or value of the color later. If the user selects red (full red, not red-ish), I want to show him "red". If he picks some weird color then the hex value will be fine. Here's some sample code that demonstrates the problem:
static string GetName(int r, int g, int b)
{
Color c = Color.FromArgb(r, g, b); // Note that specifying a = 255 doesn't make a difference
if (c.IsNamedColor)
{
return c.Name;
}
else
{
// return hex value
}
}
Even with very obvious colors like red IsNamedColor
, it never returns true. Looking at the ARGB values ββfor my color and Color.Red
, I don't see any difference. However, the call Color.Red.GetHashCode()
returns a different hash code than Color.FromArgb(255, 0, 0).GetHashCode()
.
How do I create a color using user-specified RGB values ββand get the property Name
?
source to share
This is probably not the fastest method, but it works. The colors don't have to exactly match the name you want to choose, for example. GetColorName(Color.FromArgb(254, 254, 0));
will still return yellow.
I deliberately ditched access modifiers
Color[] KnownColors;
void Init (){
KnownColors = (from colorInfo in typeof(Color).GetProperties(BindingFlags.Static | BindingFlags.CreateInstance |BindingFlags.Public)
where colorInfo.PropertyType == typeof (Color)
select (Color)colorInfo.GetValue(null, null)).Where (c => c.A != 0).ToArray();
}
string GetColorName(Color inColour)
{
// I'm just getting started on LINQ so im not
// sure how to do this with it (Maybe some one can help out with that)
int MinDistance = int.MaxValue;
Color closestKnown = Color.Black;
foreach (var c in KnownColors)
{
var d = ColorDistance(c, inColour);
if (d < MinDistance){
closestKnown = c;
MinDistance = d;
}
}
return closestKnown.Name;
}
int ColorDistance(Color c1, Color c2)
{
var ad = (c1.A - c2.A);
var rd = (c1.R - c2.R);
var gd = (c1.G - c2.G);
var bd = (c1.B - c2.B);
return (ad * ad) + (rd * rd) + (gd * gd) + (bd * bd);
}
source to share