web-dev-qa-db-fra.com

Convertir System.Drawing.Color en valeurs RVB et Hex

En utilisant C #, j'essayais de développer les deux suivants. La façon dont je le fais peut poser problème et nécessiter votre aimable conseil. De plus, je ne sais pas s’il existe une méthode pour faire de même.

private static String HexConverter(System.Drawing.Color c)
{
    String rtn = String.Empty;
    try
    {
        rtn = "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
    }
    catch (Exception ex)
    {
        //doing nothing
    }

    return rtn;
}

private static String RGBConverter(System.Drawing.Color c)
{
    String rtn = String.Empty;
    try
    {
        rtn = "RGB(" + c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString() + ")";
    }
    catch (Exception ex)
    {
        //doing nothing
    }

    return rtn;
}

Merci.

113
Hoque

Je ne vois pas le problème ici. Le code me va bien.

La seule chose à laquelle je peux penser est que les blocs try/catch sont redondants - Color est une structure et R, G et B sont des octets, donc c ne peut pas être nul et c.R.ToString(), c.G.ToString() et c.B.ToString() ne peuvent pas échouer (le seul moyen de les voir échouer est d'utiliser un NullReferenceException, et aucun d'entre eux ne peut être null).

Vous pouvez nettoyer le tout en utilisant ce qui suit:

private static String HexConverter(System.Drawing.Color c)
{
    return "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
}

private static String RGBConverter(System.Drawing.Color c)
{
    return "RGB(" + c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString() + ")";
}
182
Ari Roth

Vous pouvez garder les choses simples et utiliser le traducteur de couleurs natif:

Color red = ColorTranslator.FromHtml("#FF0000");
string redHex = ColorTranslator.ToHtml(red);

Puis divisez les trois paires de couleurs en nombres entiers:

int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
176
Troy Hunt

Si vous pouvez utiliser le C # 6, vous pouvez bénéficier de Interpolated Strings et réécrire la solution de @ Ari Roth comme ceci:

C # 6:

public static class ColorConverterExtensions
{
    public static string ToHexString(this Color c) => $"#{c.R:X2}{c.G:X2}{c.B:X2}";

    public static string ToRgbString(this Color c) => $"RGB({c.R}, {c.G}, {c.B})";
}

Aussi:

  • J'ajoute le mot clé this pour les utiliser comme méthodes d'extension.
  • Nous pouvons utiliser le type de mot-clé string à la place du nom de la classe.
  • Nous pouvons utiliser la syntaxe lambda.
  • Je les renommerai pour être plus explicite à mon goût.
34
aloisdg

par exemple.

 ColorTranslator.ToHtml(Color.FromArgb(Color.Tomato.ToArgb()))

Cela peut éviter le truc KnownColor.

23
Andy Fong

Pour le code hexadécimal, essayez ceci

  1. Get Représentation ARGB (Alpha, Rouge, Vert, Bleu) pour la couleur
  2. Filtrer Canal Alpha: & 0x00FFFFFF
  3. Mettre en forme la valeur (sous la forme hexadécimale "X6" pour hex)

Pour RVB un

  1. Just format outRed, Green, Blue values

La mise en oeuvre

private static string HexConverter(Color c) {
  return String.Format("#{0:X6}", c.ToArgb() & 0x00FFFFFF);
}

public static string RgbConverter(Color c) {
  return String.Format("RGB({0},{1},{2})", c.R, c.G, c.B);
}
1
Dmitry Bychenko

J'ai trouvé une méthode d'extension qui fonctionne assez bien

public static string ToHex(this Color color)
{
    return String.Format("#{0}{1}{2}{3}"
        , color.A.ToString("X").Length == 1 ? String.Format("0{0}", color.A.ToString("X")) : color.A.ToString("X")
        , color.R.ToString("X").Length == 1 ? String.Format("0{0}", color.R.ToString("X")) : color.R.ToString("X")
        , color.G.ToString("X").Length == 1 ? String.Format("0{0}", color.G.ToString("X")) : color.G.ToString("X")
        , color.B.ToString("X").Length == 1 ? String.Format("0{0}", color.B.ToString("X")) : color.B.ToString("X"));
}

Réf.: https://social.msdn.Microsoft.com/Forums/fr-4c77ba6c-6659-4a46-920a-7261dd4a15d0/how-to-convert-rgba-value-into-its-equivalent- code-hex? forum = winappswithcsharp

1
user1