代码之家  ›  专栏  ›  技术社区  ›  dthrasher

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

  •  15
  • dthrasher  · 技术社区  · 14 年前

    我需要将WPF应用程序中使用的颜色序列化到数据库。我想使用sRGB值,因为我们这些花了几年时间做web开发的人更熟悉这些值。

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

    更新 ToString() 方法不正确。尽管它说ToString()“使用ScRGB通道创建颜色的字符串表示”,但如果颜色是使用 FromARGB() 方法。我想这是一个没有文档记录的功能。

    看到了吗 http://msdn.microsoft.com/en-us/library/ms606572.aspx

    7 回复  |  直到 14 年前
        1
  •  21
  •   Kris    14 年前

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

    如果你想手工做的话

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

        2
  •  10
  •   Anthony Bobenrieth    11 年前

    您也可以这样做:

    string myHex = new ColorConverter().ConvertToString(myColor);
    
        3
  •  5
  •   Phil J Pearson    13 年前

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

    [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

        4
  •  2
  •   Wayne Lo    9 年前

    如果您的目的是序列化到文件并反序列化回color对象,我认为最好将color转换为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至颜色:

    byte[] bytes = System.BitConverter.GetBytes(intColor);
    Color =new System.Windows.Media.Color(){B= bytes[0], G=bytes[1], R=bytes[2], A=bytes[3]};
    
        5
  •  1
  •   LJNielsenDk    9 年前

    你可以像这样得到HTML颜色字符串

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

    here

        6
  •  0
  •   Community Jaime Torres    7 年前

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

    byte[] to hex string

        7
  •  0
  •   Vivek Dhiman    6 年前

    System.Windows.Media.Color toString()方法的内置实现提供了颜色的十六进制代码。

    类接口的代码段

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