c# - Convertir System.Drawing.Color en RGB y Hex Value
asp.net (6)
Usando C # estaba tratando de desarrollar los siguientes dos. La forma en que lo estoy haciendo puede tener algún problema y necesito su amable consejo. Además, no sé si hay algún método existente para hacer lo mismo.
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;
}
Gracias.
Encontré un método de extensión que funciona bastante 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"));
}
No estoy viendo el problema aquí. El código se ve bien para mí.
Lo único que se me ocurre es que los bloques try / catch son redundantes: Color es una estructura y R, G y B son bytes, por lo que c no puede ser nulo y cRToString()
, cGToString()
y cBToString()
no puede fallar (la única forma en que puedo ver que falla es con una NullReferenceException
, y ninguna de ellas puede ser nula).
Puedes limpiar todo usando lo siguiente:
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() + ")";
}
Para código hexadecimal prueba esto
- Obtenga una representación ARGB (Alfa, Rojo, Verde, Azul) para el color
- Filtra el canal alfa:
& 0x00FFFFFF
- Formatee el valor (como hexadecimal "X6" para hexadecimal)
Para RGB uno
- Simplemente formatee los valores
Red
,Green
,Blue
Implementación
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);
}
Puede mantenerlo simple y usar el traductor de color nativo:
Color red = ColorTranslator.FromHtml("#FF0000");
string redHex = ColorTranslator.ToHtml(red);
Luego divide los tres pares de colores en forma entera:
int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
Si puede usar C # 6, puede beneficiarse de cadenas interpoladas y reescribir la solución de @Ari Roth de la siguiente manera:
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})";
}
También:
- Agregué la palabra clave
this
para usarlos como métodos de extensiones. - Puede usar la
string
palabras clave de tipo en lugar del nombre de clase. - Puedes usar la sintaxis lambda
- Los cambio de nombre para ser más explícitos para mi gusto.
p.ej
ColorTranslator.ToHtml(Color.FromArgb(Color.Tomato.ToArgb()))
Esto puede evitar el truco de KnownColor.