Convertir System.Drawing.Color en RVB et valeur hexadécimale

125

En utilisant C #, j'essayais de développer les deux suivants. La façon dont je le fais peut poser problème et avoir besoin de vos aimables conseils. De plus, je ne sais pas s'il existe une méthode existante 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.

Nazmul
la source

Réponses:

202

Je ne vois pas le problème ici. Le code me semble bon.

La seule chose que je peux penser est que les try / blocs catch sont redondants - La couleur est un struct et R, G, et B sont des octets, donc c ne peut pas être nulle et non c.R.ToString(), c.G.ToString()et c.B.ToString()ne peut manquer en fait (le la seule façon dont je peux les voir échouer est avec a NullReferenceException, et aucun d'entre eux ne peut être nul).

Vous pouvez tout nettoyer en utilisant les éléments suivants:

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() + ")";
}
Ari Roth
la source
1
J'irais jusqu'à dire que les blocs try-catch vides devraient (presque) universellement être éradiqués. Ils ont un grand potentiel pour conduire à un code bogué, sinon maintenant, alors que ce code est modifié. Pourtant, +1 pour le code nettoyé et à l'OP +1 pour une question bien cadrée.
JMD
7
Il m'a fallu un certain temps pour trouver l'équivelant VB: String.Format ("# {0: X2} {1: X2} {2: X2}", cR, cG, cB)
zacharydl
1
Je poste une adaptation de votre code en C # 6 comme réponse alternative. Vous pouvez le voir ici .
aloisdg passe à codidact.com le
Cela produira la mauvaise couleur si la couleur a un canal alpha (transparence). Vous obtiendrez une opacité totale.
LarryBud
@LarryBud Absolument vrai, et merci de l'avoir signalé. Mon exemple a ignoré le canal alpha uniquement parce que je supprimais la question d'origine, qui ne l'incluait pas non plus. :)
Ari Roth
189

Vous pouvez rester simple et utiliser le traducteur de couleurs natif:

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

Puis divisez les trois paires de couleurs sous forme entière:

int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
Chasse à Troie
la source
7
Mais si je fais de cette façon, Color red = System.Drawing.Color.Red; chaîne redHex = ColorTranslator.ToHtml (rouge); il ne fournit pas la valeur hexadécimale.
Nazmul
Je devrais certainement faire, j'ai testé ce code spécifiquement et j'ai obtenu # "FF0000". Qu'est-ce que vous obtenez? Vous pouvez également vous référer à la référence MSDN: msdn.microsoft.com/en-us/library
Troy Hunt
Essayez avec Color red = System.Drawing.Color.Red; -> il ne fournit pas # FF0000.
Nazmul
9
Le code que vous avez fourni fonctionne mais lorsque je change la première ligne de votre code en: Color red = System.Drawing.Color.Red; -> Ensuite, il ne donne pas le code hexadécimal. Il donne "Rouge" comme sortie.
Nazmul
4
@Hoque - Confirmé. ColorTranslator donne un nom "convivial" à la couleur. Comme c'est ennuyeux!
Anon
38

Si vous pouvez utiliser C # 6 ou supérieur, 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é thispour les utiliser comme méthodes d'extensions.
  • Nous pouvons utiliser le mot-clé type stringau lieu du nom de la classe.
  • Nous pouvons utiliser la syntaxe lambda.
  • Je les renomme pour être plus explicites à mon goût.
aloisdg passe à codidact.com
la source
Si propre ... +1!
Shockwaver
26

par exemple

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

Cela peut éviter l'astuce KnownColor.

Andy Fong
la source
1

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/en-US/4c77ba6c-6659-4a46-920a-7261dd4a15d0/how-to-convert-rgba-value-into-its-equivalent-hex-code? forum = winappswithcsharp

utilisateur1
la source
Je crois que ça devrait être Hex2, pas Hex, sinon la couleur peut être mal interpolée.
Mohammed Noureldin
@MohammedNoureldin Où irait Hex2 dans le code, j'ai vu des couleurs légèrement différentes parfois?
user1
Je voulais dire X2au lieu de X, sinon vous pourriez obtenir 1au lieu de 01cela, ce sera un problème.
Mohammed Noureldin
@MohammedNoureldin Ouais, avec X2alors vous n'avez pas besoin de tous les color.B.ToString("X").Length == 1 ? ternaires.
ProfK
1

Pour le code hexadécimal, essayez ceci

  1. Obtenez une représentation ARVB (Alpha, Rouge, Vert, Bleu) pour la couleur
  2. Filtrer le canal Alpha:& 0x00FFFFFF
  3. Formatez la valeur (en hexadécimal "X6" pour hexadécimal)

Pour RVB un

  1. Il suffit de formater sur Red , Green, les Bluevaleurs

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);
}
Dmitry Bychenko
la source