Convertir System.Drawing.Color en RGB y Hex Value

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 = "#" + cRToString("X2") + cGToString("X2") + cBToString("X2"); } catch (Exception ex) { //doing nothing } return rtn; } private static String RGBConverter(System.Drawing.Color c) { String rtn = String.Empty; try { rtn = "RGB(" + cRToString() + "," + cGToString() + "," + cBToString() + ")"; } catch (Exception ex) { //doing nothing } return rtn; } 

Gracias.

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 "#" + cRToString("X2") + cGToString("X2") + cBToString("X2"); } private static String RGBConverter(System.Drawing.Color c) { return "RGB(" + cRToString() + "," + cGToString() + "," + cBToString() + ")"; } 

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) => $"#{cR:X2}{cG:X2}{cB:X2}"; public static string ToRgbString(this Color c) => $"RGB({cR}, {cG}, {cB})"; } 

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

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

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})", cR, cG, cB); }