How do I serialize a System.Windows.Media.Color object to an sRGB string?
我需要将WPF应用程序中使用的颜色序列化到数据库。我想使用sRGB值,因为对于我们这些在过去几年中从事Web开发的人来说,它们更为熟悉。
a如何从system.windows.media.color对象获取argb字符串(如ffffffff)?
更新:我被有关msdn的文档误导了。正如@kris下面指出的,
请参阅http://msdn.microsoft.com/en-us/library/ms606572.aspx
如果使用color.fromrgb或color.fromargb而不是fromscrgb创建颜色,则应该从toString获得十六进制字符串结果。
如果你想手动操作
1 | string.Format("#{0:X2}{1:X2}{2:X2}{3:X2}", c.A, c.R, c.G, c.B); |
您可以使用int.parse(,numberStyles.hexNumber)进行其他操作。
注意sRGB和scRGB表示不同的颜色空间,请确保使用所需的颜色空间。
您也可以这样做:
1 | string myHex = new ColorConverter().ConvertToString(myColor); |
我创建了一个结构来处理转换和序列化。它为我解决了两个问题:它是可串行的,它纠正了拼写;)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | [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); } } |
只需使用
如果您的目的是序列化到文件并反序列化回颜色对象,我认为您最好将颜色转换为Int32,反之亦然。将Int32序列化/反序列化是很简单的。如果这是您的目的,这里是代码:颜色到IT32:
1 2 3 4 5 6 | 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); |
颜色32
1 2 | byte[] bytes = System.BitConverter.GetBytes(intColor); Color =new System.Windows.Media.Color(){B= bytes[0], G=bytes[1], R=bytes[2], A=bytes[3]}; |
这个答案是针对gdi颜色,而不是wpf,所以可能没什么帮助。
你可以得到这样的HTML颜色字符串
1 2 | System.Drawing.Color c = System.Drawing.ColorTranslator.FromHtml("#F5F7F8"); String strHtmlColor = System.Drawing.ColorTranslator.ToHtml(c); |
这是MSDN文档。
System.Windows.Media.Color ToString()方法的内部实现提供了颜色的十六进制代码。
类接口中的代码段
1 2 3 4 5 6 7 8 9 10 | // // 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(); |
您可以从一个颜色实例中以字节的形式获取A、R、G和B值,因此您只需要将字节转换为十六进制,并将十六进制值连接为字符串。
字节[]到十六进制字符串