Почему Color.IsNamedColor не работает, когда я создаю цвет с помощью Color.FromArgb()?
В моем приложении я позволяю пользователю создать цвет, а затем покажу ему имя или значение цвета. Если пользователь выбирает красный (полностью красный, а не красный), я хочу показать ему "красный". Если он выберет какой-то странный цвет, тогда значение шестнадцатеричного кода будет просто нормальным. Вот пример кода, который демонстрирует проблему:
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
}
}
Даже с очень очевидными цветами, такими как красный IsNamedColor
никогда не возвращает истину. Глядя на значения ARGB для моего цвета и Color.Red
Я не вижу разницы. Тем не менее, призывая Color.Red.GetHashCode()
возвращает другой хэш-код, чем Color.FromArgb(255, 0, 0).GetHashCode()
,
Как я могу создать цвет, используя указанные пользователем значения RGB и получить Name
собственность выходит правильно?
2 ответа
Тип значения свойства: System.Boolean
Значение true, если этот цвет был создан с использованием метода FromName или метода FromKnownColor; иначе ложно.
Вы можете построить карту из всех KnownColor
S RGB кортежей к именам, я полагаю.
Это, вероятно, не самый быстрый метод, но он работает. Цвета не обязательно должны точно соответствовать названию, например. GetColorName(Color.FromArgb(254, 254, 0));
все равно вернется желтый.
Я намеренно пропустил модификаторы доступа
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);
}