2010-03-07 21 views
92

Usando C# Estaba intentando 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.Convertir System.Drawing.Color a RGB y Hex Value

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

Thanks.

+0

@Rod https://stackoverflow.com/questions/20750062/what- is-meaning-of-tostringx2 – samgak

Respuesta

143

estoy a falta de ver el problema aquí. El código se ve bien para mí.

La única cosa que puedo pensar es que los bloques try/catch son redundantes - El color es una estructura y R, G y B son bytes, por lo que C no puede ser nulo y c.R.ToString(), c.G.ToString() y c.B.ToString() realmente no puede fallar (la única forma en que puedo ver que falla es con un NullReferenceException, y ninguno de ellos puede ser nulo en realidad).

Se puede limpiar todo el asunto utilizando la 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() + ")"; 
} 
+0

Iría tan lejos como para decir que los bloques vacíos de captura deberían ser (casi) universalmente erradicados. Tienen un gran potencial para generar un código erróneo, si no ahora en el camino cuando se modifica este código. Aún así, +1 para el código limpio, y para OP +1 para una pregunta bien enmarcada. – JMD

+7

Me llevó un tiempo encontrar el equivalente de VB: String.Format ("# {0: X2} {1: X2} {2: X2}", cR, cG, cB) – zacharydl

+0

Publiqué una adaptación de tu código a C# 6 como respuesta alternativa. Puede verlo [aquí] (http://stackoverflow.com/a/37821008/1248177). – aloisdg

149

Se podía mantenerlo simple y utilizar el traductor de color nativo:

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

luego romper los tres pares de colores en forma decimal:

int decValue = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber); 
+5

Pero si lo hago de esta manera, Color rojo = System.Drawing.Color.Red; cadena redHex = ColorTranslator.ToHtml (rojo); no proporciona el valor hexadecimal. – Hoque

+0

Ciertamente debería hacerlo, probé ese código específicamente y obtuve el # "FF0000". ¿Que estas obteniendo? También puede referirse a la referencia de MSDN: http://msdn.microsoft.com/en-us/library/system.drawing.colortranslator.tohtml.aspx –

+0

Pruebe con Color rojo = System.Drawing.Color.Red; -> no proporciona # FF0000. – Hoque

18

por ejemplo,

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

Esto puede evitar el truco de KnownColor.

+0

¡Funciona como un encanto! muchas gracias. –

1

He encontrado 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

+0

Creo que debería ser Hex2, no Hex, de lo contrario el color podría estar incorrectamente interpolado. –

+0

@MohammedNoureldin ¿Dónde iría Hex2 en el código, a veces he visto colores ligeramente diferentes? – user1

+0

Quise decir 'X2' en lugar de' X', de lo contrario podría obtener '1' en lugar de' 01', entonces sería un problema. –

19

Si puede utilizar C# 6, puede beneficiarse de Interpolated Strings y reescribir @Ari Roth's solution así:

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:

  • Agrego la palabra clave this para usarlos como métodos de extensiones.
  • Puede usar la palabra clave type string en lugar del nombre de la clase.
  • Puedes usar la sintaxis lambda
  • Los renombro para que sean más explícitos para mi gusto.
1

Para el código hexadecimal a probar esto

  1. Obtener ARGB (alfa, rojo, verde, azul) la representación del color
  2. El filtro cabo canal alfa: & 0x00FFFFFF
  3. Formato cabo el valor (como hexadecimal "X6" para hex)

Para RGB uno

  1. Sólo formato caboRed, Green, Blue valores

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