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.
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() + ")";
}
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);
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:
this
pour les utiliser comme méthodes d'extension.string
à la place du nom de la classe.par exemple.
ColorTranslator.ToHtml(Color.FromArgb(Color.Tomato.ToArgb()))
Cela peut éviter le truc KnownColor.
Pour le code hexadécimal, essayez ceci
& 0x00FFFFFF
Pour RVB un
Red
, Green
, Blue
valuesLa 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);
}
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"));
}