【问题标题】:How do I serialize a System.Windows.Media.Color object to an sRGB string?如何将 System.Windows.Media.Color 对象序列化为 sRGB 字符串?
【发布时间】:2011-03-19 21:49:17
【问题描述】:

我需要将 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

【问题讨论】:

    标签: wpf serialization colors


    【解决方案1】:

    如果您使用 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 指的是不同的色彩空间,请确保使用您想要的。

    【讨论】:

    • 你的意思是如果我使用 FromArgb 创建了 Color 对象,ToString 将返回 ARGB 十六进制字符串而不是 ScRgb 值?这与 MSDN 文档中所说的相矛盾:msdn.microsoft.com/en-us/library/ms606572.aspx
    • 我没有在文档中注意到这一点,但在使用这些方法时它确实会生成十六进制格式。查看反射器中设置了一个标志,该标志在 ToString 实现中使用。
    • 是的。 ToString() 给了我想要的格式。看起来 MSDN 文档不完整。
    • ToString 如果按上述方式创建,则可以工作。 referencesource.microsoft.com/#PresentationCore/Core/CSharp/…
    【解决方案2】:

    你也可以这样做:

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

    【讨论】:

    【解决方案3】:

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

    [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

    【讨论】:

    • 老兄,Color 是美式拼写。 Colour 是英国人。
    • 这叫讽刺。
    【解决方案4】:

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

      此答案适用于 GDI 颜色,而不适用于 WPF,因此可能没有太大帮助。

      你可以像这样获取 HTML 颜色字符串(并返回)

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

      here 是 MSDN 文档。

      【讨论】:

      • 那是 System.Drawing.Color (GDI+),不是 System.Windows.Media.Color (WPF)。
      【解决方案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();
      

      【讨论】:

        【解决方案7】:

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

        byte[] to hex string

        【讨论】:

          猜你喜欢
          • 2010-09-13
          • 2022-11-15
          • 2011-01-26
          • 2016-09-23
          • 2020-10-19
          • 2015-08-15
          • 1970-01-01
          • 2018-11-01
          相关资源
          最近更新 更多