c# asp.net rgb system.drawing.color

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

Ref: 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


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

  1. Obtenga una representación ARGB (Alfa, Rojo, Verde, Azul) para el color
  2. Filtra el canal alfa: & 0x00FFFFFF
  3. Formatee el valor (como hexadecimal "X6" para hexadecimal)

Para RGB uno

  1. 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.