Tutorial :How do I serialize a System.Windows.Media.Color object to an sRGB string?



Question:

I need to serialize a color used in a WPF application to a database. I'd like to use the sRGB values, because they're more familiar to those of us that have spent the last few years doing web development.

How can a get an ARGB string (like #FFFFFFFF) from a System.Windows.Media.Color object?

UPDATE: I was misled by the documentation on MSDN. As @Kris noted below, the documentation for the ToString() method is incorrect. Although it says that ToString() "creates a string representation of the color using the ScRGB channels", it will actually return a string in ARGB hex format if the color was created using the FromARGB() method. It's an undocumented feature, I suppose.

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


Solution:1

If you create your colors using either Color.FromRgb or Color.FromArgb instead of FromScRgb you should get a hex string result from ToString.

If you want to do it manually

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

You can use int.Parse(,NumberStyles.HexNumber) to go the other way.

Note sRGB and scRGB refer to different color spaces, make sure your using the one you want.


Solution:2

You can also do it this way:

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


Solution:3

I created a struct to handle conversion and serialisation. It solves two problems for me: it is serialisable and it corrects the spelling ;)

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

Just use Colour where you would otherwise use System.Windows.Media.Color


Solution:4

If your purpose is to serialize to a file and deserialize back to the color object, I think you are better of to convert color to an Int32 and vice versa. It is no brainier to serialize/deserialize Int32. If this is your purpose, here is the code: Color To 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 To 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]};  


Solution:5

This answer is for GDI colors, and not WPF, so might not be much help.

You can get the HTML color string (and back) like this

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

here is the MSDN documentation.


Solution:6

You can get the A, R, G and B values from a Color instance as bytes, so you just need to convert the bytes to hex and concatenate the hex values as strings.

byte[] to hex string


Solution:7

There is inbuild implementation for System.Windows.Media.Color toString() method which gives hexcode of the color.

Snippet from the class interface it self

        //          // Summary:          //     Creates a string representation of the color using the sRGB channels.          //          // Returns:          //     The string representation of the color. The default implementation represents          //     the System.Byte values in hex form, prefixes with the # character, and starts          //     with the alpha channel. For example, the System.Windows.Media.Color.ToString()          //     value for System.Windows.Media.Colors.AliceBlue is #FFF0F8FF.          public override string ToString();  

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »