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

时间:2010-07-23 02:59:10

标签: wpf serialization colors

我需要将WPF应用程序中使用的颜色序列化到数据库中。我想使用sRGB值,因为他们对我们这些在过去几年中进行Web开发的人更熟悉。

如何从System.Windows.Media.Color对象获取ARGB字符串(如#FFFFFFFF)?

更新:我被MSDN上的文档误导了。正如下面提到的@Kris,ToString()方法的文档不正确。虽然它说ToString()“使用ScRGB通道创建颜色的字符串表示”,但如果颜色是使用FromARGB()方法创建的,它实际上将返回ARGB十六进制格式的字符串。我想这是一个没有文档记录的功能。

请参阅http://msdn.microsoft.com/en-us/library/ms606572.aspx

7 个答案:

答案 0 :(得分:18)

如果使用Color.FromRgb或Color.FromArgb而不是FromScRgb创建颜色,则应从ToString获取十六进制字符串结果。

如果你想手动完成

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 :(得分:8)

你也可以这样做:

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

答案 2 :(得分:4)

我创建了一个处理转换和序列化的结构。它解决了我的两个问题:它是可序列化的,它可以纠正拼写;)

[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

答案 3 :(得分:2)

如果您的目的是序列化为文件并反序列化回颜色对象,我认为您最好将颜色转换为Int32,反之亦然。将Int32序列化/反序列化并不聪明。如果这是你的目的,这里是代码: 颜色到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]};

答案 4 :(得分:1)

这个答案适用于GDI颜色,而不是WPF,所以可能没什么帮助。

您可以像这样获取HTML颜色字符串(和背面)

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

here是MSDN文档。

答案 5 :(得分:0)

您可以从Color实例中获取A,R,G和B值作为字节,因此您只需将字节转换为十六进制并将十六进制值连接为字符串。

byte[] to hex string

答案 6 :(得分:0)

System.Windows.Media.Color toString()方法有inbuild实现,它给出了颜色的十六进制代码。

它自己的类接口的片段

        //
        // 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();