【问题标题】:Set System.Drawing.Color values设置 System.Drawing.Color 值
【发布时间】:2011-08-26 08:45:33
【问题描述】:

您好,如何在System.Drawing.Color.G 中设置R G B 值?

类似于System.Drawing.Color.G=255; 是不允许的,因为它是只读的

Property or indexer 'System.Drawing.Color.G' cannot be assigned toit is read only

我只需要通过分配自定义R G B 值来创建一个Color 对象

【问题讨论】:

  • 请注意其他提出此问题的人,此问题仅影响 System.Drawing。如果您使用的是 WPF,则应该使用 System.Windows.Media 更多信息请参阅这篇文章:stackoverflow.com/questions/2428930/…

标签: c# .net colors immutability system.drawing.color


【解决方案1】:

您可以使用静态FromArgb 方法创建颜色:

Color redColor = Color.FromArgb(255, 0, 0);

您还可以使用 following overload 指定 alpha。

【讨论】:

  • 干净简单。
【解决方案2】:

Color 结构是不可变的(所有结构都应该如此),这意味着一旦创建了特定实例,就无法更改其属性的值。

相反,您需要使用所需的属性值创建结构的 new 实例。由于您想使用其分量 RGB 值创建颜色,因此您需要使用 FromArgb method

Color myColor = Color.FromArgb(100, 150, 75);

【讨论】:

  • -1 表示“所有结构都应该如此”。祝你写一些 C 代码好运。
  • @Dariusz 我在这个问题上没有看到 [c] 标签。我一直在写 C 代码,只是我写的方式与我写 C# 代码的方式不同......
【解决方案3】:

你可以这样做:

Color c = Color.FromArgb(red, green, blue); //red, green and blue are integer variables containing red, green and blue components

【讨论】:

    【解决方案4】:

    您必须使用 Color.FromArgb 方法来创建新的颜色结构

    var newColor = Color.FromArgb(0xCC,0xBB,0xAA);
    

    【讨论】:

      【解决方案5】:

      您可以进行扩展以仅更改一种颜色组件

      static class ColorExtension
      {
          public static Color ChangeG(Color this color,byte g) 
          {
              return Color.FromArgb(color.A,color.R,g,color.B);
          }
      }
      

      那么你可以使用这个:

        yourColor = yourColor.ChangeG(100);
      

      【讨论】:

      • 是的,但不要这样做。它隐藏了一个事实,即您实际上是在创建结构的一个新实例,这对于尚未了解不变性的人来说非常混乱。对于这样做的人来说相当无用。
      • 首先您需要了解不变性。如果你一直写yourColor = Color.FromArgb(yourColor.A,yourColor.R,100,yourColor.B);,代码会变得更丑。所以很有用
      • 很难理解你认为显式代码的丑陋之处。
      • @CodyGray:写出所有内容的一个主要问题是,代码的意图和/或效果是否仅仅是更改G,或者是否会产生其他效果,在视觉上几乎不明显也是。鉴于 Color 结构的设计,我认为没有什么好的方法可以解决这个问题。如果有一个简单的ArgbColor 结构,它有四个暴露的单字节字段,以及一个可以隐式转换的Color 类,那么var temp = myColor.AsArgb(); temp.Green=100; myColor = temp; 会清楚地表明,如果例如myColor 曾是命名或系统颜色...
      • ...AsArgb 方法将过滤掉任何此类特征,但将保留除 Green 之外未被该方法过滤掉的任何特征。实际上,如果定义了一个扩展方法来转换为开放字段结构类型,那么即使定义了Color,这种方法也可能是可行的,并且可能是最好的处理方式。
      【解决方案6】:
      using System;
      using System.Drawing;
      public struct MyColor
          {
              private byte a, r, g, b;        
              public byte A
              {
                  get
                  {
                      return this.a;
                  }
              }
              public byte R
              {
                  get
                  {
                      return this.r;
                  }
              }
              public byte G
              {
                  get
                  {
                      return this.g;
                  }
              }
              public byte B
              {
                  get
                  {
                      return this.b;
                  }
              }       
              public MyColor SetAlpha(byte value)
              {
                  this.a = value;
                  return this;
              }
              public MyColor SetRed(byte value)
              {
                  this.r = value;
                  return this;
              }
              public MyColor SetGreen(byte value)
              {
                  this.g = value;
                  return this;
              }
              public MyColor SetBlue(byte value)
              {
                  this.b = value;
                  return this;
              }
              public int ToArgb()
              {
                  return (int)(A << 24) || (int)(R << 16) || (int)(G << 8) || (int)(B);
              }
              public override string ToString ()
              {
                  return string.Format ("[MyColor: A={0}, R={1}, G={2}, B={3}]", A, R, G, B);
              }
      
              public static MyColor FromArgb(byte alpha, byte red, byte green, byte blue)
              {
                  return new MyColor().SetAlpha(alpha).SetRed(red).SetGreen(green).SetBlue(blue);
              }
              public static MyColor FromArgb(byte red, byte green, byte blue)
              {
                  return MyColor.FromArgb(255, red, green, blue);
              }
              public static MyColor FromArgb(byte alpha, MyColor baseColor)
              {
                  return MyColor.FromArgb(alpha, baseColor.R, baseColor.G, baseColor.B);
              }
              public static MyColor FromArgb(int argb)
              {
                  return MyColor.FromArgb(argb & 255, (argb >> 8) & 255, (argb >> 16) & 255, (argb >> 24) & 255);
              }   
              public static implicit operator Color(MyColor myColor)
              {           
                  return Color.FromArgb(myColor.ToArgb());
              }
              public static implicit operator MyColor(Color color)
              {
                  return MyColor.FromArgb(color.ToArgb());
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 2011-08-09
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        相关资源
        最近更新 更多