2010-07-23 3 views
13

Ich muss eine Farbe in einer WPF-Anwendung in einer Datenbank serialisieren. Ich würde gerne die sRGB-Werte verwenden, weil sie denen von uns vertrauter sind, die in den letzten Jahren Web-Entwicklung betrieben haben.Wie serialisiert ich ein System.Windows.Media.Color -Objekt zu einer sRGB-Zeichenfolge?

Wie kann eine ARGB-Zeichenfolge (wie #FFFFFFFF) von einem System.Windows.Media.Color-Objekt abgerufen werden?

UPDATE: Ich wurde von der Dokumentation auf MSDN irregeführt. Wie @Kris unten bemerkt, ist die Dokumentation für die Methode ToString() falsch. Obwohl es besagt, dass ToString() "eine Zeichenfolgenrepräsentation der Farbe mithilfe der ScRGB-Kanäle erstellt", gibt es tatsächlich eine Zeichenfolge im ARGB-Hexadezimalformat zurück, wenn die Farbe mit der Methode FromARGB() erstellt wurde. Es ist eine undokumentierte Funktion, nehme ich an.

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

Antwort

16

Wenn Sie Ihre Farben entweder mit Color.FromRgb oder Color.FromArgb anstelle von FromScRgb erstellen, sollten Sie ein Hex-String-Ergebnis von ToString erhalten.

Wenn Sie es manuell

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

tun möchten, können Sie verwenden int.Parse (, NumberStyles.HexNumber) in die andere Richtung zu gehen.

Hinweis sRGB und scRGB beziehen sich auf verschiedene Farbräume, stellen Sie sicher, dass Sie den gewünschten verwenden.

+0

Sie meinen, dass, wenn ich das Color-Objekt mit FromArgb erstellt, ToString die ARGB-Hex-Zeichenfolge anstelle des ScRgb-Werts zurückgibt? Das widerspricht dem, was es in der MSDN-Dokumentation sagt: http://msdn.microsoft.com/en-us/library/ms606572.aspx. – dthrasher

+0

Ich hatte das in der Dokumentation nicht bemerkt, aber es erzeugt ein Hex-Format, wenn diese Methoden verwendet werden. Beim Suchen im Reflektor wird ein Flag gesetzt, das in der ToString-Implementierung verwendet wird. – Kris

+0

Yup. ToString() gibt mir das gewünschte Format. Sieht aus wie die MSDN-Dokumentation unvollständig ist. – dthrasher

0

Sie können die A, R, G und B-Werte aus einer Color-Instanz als Bytes erhalten, so dass Sie nur das Bytes konvertieren müssen die Hex-Werte als Strings verhexen und verketten.

byte[] to hex string

1

Diese Antwort ist für GDI Farben und nicht WPF, so vielleicht nicht viel helfen.

Sie können den HTML-Farb String bekommen (und zurück) wie diese

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

here ist die MSDN-Dokumentation.

+3

die für das System.Drawing.Color (GDI +), nicht System.Windows.Media.Color (WPF). – AndrewS

+3

ja, wie ich festgestellt habe. –

4

Ich habe eine Struktur erstellt, um Konvertierung und Serialisierung zu behandeln. Es löst zwei Probleme für mich: es ist serialisable und es korrigiert die Rechtschreibung;)

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

Nur Colour verwenden, wo man sonst System.Windows.Media.Color

+0

Dude, 'Color' ist amerikanische Schreibweise. 'Colour' ist britisch. –

+3

Es heißt Sarkasmus. – Ricky

8

Sie auch es auf diese Weise tun verwenden würde können:

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

Es gibt keine solche Methode in 'ColorConverter' –

+1

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

+0

Kannst du nicht einfach verwenden. ToString() – Epirocks

1

Wenn Sie in eine Datei serialisieren und wieder zum Farbobjekt deserialisieren möchten, ist es besser, die Farbe in ein Int32 zu konvertieren und umgekehrt. Es ist nicht sinnvoller, Int32 zu serialisieren/zu deserialisieren. Wenn dies Ihr Ziel ist es, hier ist der Code: Farbe 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 Um Farbe:

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