2010-07-23 22 views
13

Necesito serializar un color usado en una aplicación WPF a una base de datos. Me gustaría usar los valores sRGB, porque son más familiares para aquellos de nosotros que hemos pasado los últimos años haciendo desarrollo web.¿Cómo serializo un objeto System.Windows.Media.Color en una cadena sRGB?

¿Cómo se puede obtener una cadena ARGB (como #FFFFFFFF) de un objeto System.Windows.Media.Color?

ACTUALIZACIÓN: La documentación de MSDN me indujo a error. Como @Kris anota a continuación, la documentación para el método ToString() es incorrecta. Aunque dice que ToString() "crea una representación de cadena del color utilizando los canales ScRGB", en realidad devolverá una cadena en formato hexadecimal ARGB si el color se creó utilizando el método FromARGB(). Es una característica no documentada, supongo.

Ver http://msdn.microsoft.com/en-us/library/ms606572.aspx

Respuesta

16

Si crea los colores utilizando Color.FromRgb o Color.FromArgb en lugar de FromScRgb, debe obtener un resultado de cadena hexadecimal de ToString.

Si desea hacerlo de forma manual

string.Format("#{0:X2}{1:X2}{2:X2}{3:X2}", c.A, c.R, c.G, c.B); 

Usted puede utilizar int.Parse (, NumberStyles.HexNumber) para ir a otro lado.

Nota sRGB y scRGB se refieren a espacios de color diferentes, asegúrese de usar el que desee.

+0

¿Quiere decir que si creo el objeto Color usando FromArgb, ToString devolverá la cadena hexadecimal ARGB en lugar del valor ScRgb? Eso contradice lo que dice en la documentación de MSDN: http://msdn.microsoft.com/en-us/library/ms606572.aspx. – dthrasher

+0

No lo había notado en la documentación pero genera un formato hexadecimal al usar esos métodos. Mirando en el reflector, se establece un indicador que se usa en la implementación de ToString. – Kris

+0

Sí. ToString() me da el formato que quiero. Parece que la documentación de MSDN está incompleta. – dthrasher

0

Usted puede obtener los valores de A y B, R, G y desde una instancia de color como bytes, por lo que sólo necesita convertir los bytes a hexadecimal y concatenar los valores hexadecimales como cadenas.

byte[] to hex string

1

Esta respuesta es para los colores de GDI, y no WPF, por lo que podría no ser de mucha ayuda.

Usted puede obtener la cadena de color HTML (y viceversa) como esto

System.Drawing.Color c = System.Drawing.ColorTranslator.FromHtml("#F5F7F8"); 
String strHtmlColor = System.Drawing.ColorTranslator.ToHtml(c); 

here es la documentación de MSDN.

+3

Eso es para el sistema.Drawing.Color (GDI +), no System.Windows.Media.Color (WPF). – AndrewS

+3

sí, como noté. –

4

Creé una estructura para gestionar la conversión y la serialización. Se resuelve dos problemas para mí: es serialisable y corrige la ortografía;)

[Serializable] 
public struct Colour 
    { 
    public byte A; 
    public byte R; 
    public byte G; 
    public byte B; 

    public Colour(byte a, byte r, byte g, byte b) 
     { 
     A = a; 
     R = r; 
     G = g; 
     B = b; 
     } 

    public Colour(Color color) 
     : this(color.A, color.R, color.G, color.B) 
     { 
     } 

    public static implicit operator Colour(Color color) 
     { 
     return new Colour(color); 
     } 

    public static implicit operator Color(Colour colour) 
     { 
     return Color.FromArgb(colour.A, colour.R, colour.G, colour.B); 
     } 
    } 

sólo tiene que utilizar Colour en el que, de otro modo utilizar System.Windows.Media.Color

+0

Dude, 'Color' es deletreo americano. 'Colour' es británico. –

+3

Se llama sarcasmo. – Ricky

8

También puede hacerlo de esta manera:

string myHex = new ColorConverter().ConvertToString(myColor); 
+0

No existe tal método en 'ColorConverter' –

+1

@EmpereurAiman ​​se hereda https://msdn.microsoft.com/en-us/library/92ybstc2%28v=vs.110%29.aspx – RJFalconer

+0

No se puede simplemente usar. Encadenar() – Epirocks

1

Si su propósito es serializar a un archivo y deserializar de nuevo al objeto de color, creo que es mejor que convierta el color a un Int32 y viceversa. No es más inteligente serializar/deserializar Int32. Si este es su propósito, aquí está el código: color Para Int32:

 byte[] color = new byte[4]; 
     color[0] = Color.B; 
     color[1] = Color.G; 
     color[2] = Color.R; 
     color[3] = Color.A; 
     Int32 intColor = System.BitConverter.ToInt32(color, 0); 

Int32 Para Color:

byte[] bytes = System.BitConverter.GetBytes(intColor); 
Color =new System.Windows.Media.Color(){B= bytes[0], G=bytes[1], R=bytes[2], A=bytes[3]}; 
Cuestiones relacionadas