关于wpf:如何将System.Windows.Media.Color对象序列化为sRGB字符串?

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下面指出的,ToString()方法的文档不正确。虽然它说toString()"使用scrGB通道创建颜色的字符串表示",但如果颜色是使用FromARGB()方法创建的,它实际上将返回argb hex格式的字符串。我想这是一个没有文件证明的功能。

请参阅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);
        }
    }

只需使用Colour,否则将使用System.Windows.Media.Color


如果您的目的是序列化到文件并反序列化回颜色对象,我认为您最好将颜色转换为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值,因此您只需要将字节转换为十六进制,并将十六进制值连接为字符串。

字节[]到十六进制字符串