3 votes

Pourquoi Color.IsNamedColor ne fonctionne-t-il pas lorsque je crée une couleur en utilisant Color.FromArgb()?

Dans mon application, je permets à l'utilisateur de créer une couleur, puis de lui montrer le nom ou la valeur de la couleur plus tard. Si l'utilisateur choisit le rouge (tout rouge, pas rougeâtre), je veux lui montrer "rouge". S'il choisit une couleur étrange, alors la valeur hexadécimale serait très bien. Voici un code d'exemple qui démontre le problème :

static string GetName(int r, int g, int b)
{
    Color c = Color.FromArgb(r, g, b);  // Notez que spécifier a = 255 ne fait aucune différence
    if (c.IsNamedColor)
    {
        return c.Name;
    }
    else
    {
        // retourner la valeur hexadécimale
    }
}

Même avec des couleurs très évidentes comme le rouge, IsNamedColor ne retourne jamais vrai. En regardant les valeurs ARGB de ma couleur et de Color.Red, je ne vois aucune différence. Cependant, appeler Color.Red.GetHashCode() renvoie une valeur de hachage différente de Color.FromArgb(255, 0, 0).GetHashCode().

Comment puis-je créer une couleur en utilisant des valeurs RGB spécifiées par l'utilisateur et avoir la propriété Name correctement affichée ?

2voto

Kevin Montrose Points 11936

De MSDN.

Type de valeur de propriété : System.Boolean
true si cette couleur a été créée en utilisant la méthode FromName ou la méthode FromKnownColor ; sinon, false.

Vous pourriez construire une carte à partir de tous les tuples rgb de KnownColor vers les noms, je suppose.

0voto

Courtney D Points 1567

Ce n'est probablement pas la méthode la plus rapide, mais ça fonctionne. Les couleurs n'ont pas besoin d'être exactement identiques pour que le nom soit choisi par exemple. GetColorName(Color.FromArgb(254, 254, 0)); retournera toujours Jaune.

J'ai délibérément omis les modificateurs d'accès

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)
{

    // Je commence tout juste avec LINQ, je ne suis pas sûr de comment faire cela avec (Peut-être que quelqu'un peut aider avec ça)

    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);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X