2011-05-16 43 views
65

嗨如何設置R G BSystem.Drawing.Color.G設置System.Drawing.Color值

這就好比是System.Drawing.Color.G=255;是不允許的,因爲它的只讀

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

我只需要通過定製分配R G B

創建 Color對象
+1

注意別人說來這個問題,這個問題隻影響System.Drawing中。如果你使用的是WPF,你應該使用System.Windows.Media更多信息請看這篇文章:http://stackoverflow.com/questions/2428930/what-is-the-difference-between-system-drawing-color- and-system-windows-media-col – HK1 2014-02-18 17:52:55

回答

112

您可以創建使用靜態FromArgb方法的顏色:

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

您還可以使用指定alpha。

10

Color結構不變(就像所有的結構確實應該),這意味着一旦該特定實例已創建其屬性的值不能改變。

取而代之,您需要創建一個新的具有所需屬性值的結構實例。既然你想用它的分量RGB值創建一個顏色,你需要使用FromArgb method

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

-1「因爲所有結構都應該是真實的」。祝你好運寫一些C代碼。 – Dariusz 2013-01-30 07:51:22

+9

@Dariusz我在這個問題上看不到[c]標籤。我一直在寫C代碼,我只是不會像我的C#代碼那樣編寫代碼... – 2013-04-21 12:27:58

2

你可以這樣做:

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

您必須使用Color.FromArgb方法來創建新的顏色結構

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

您可以擴展到只是改變一個顏色分量

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); 
+4

是的,但不要這樣做。它隱藏了一個事實,即您實際上正在創建一個新的結構實例,對於不瞭解不變性的人非常困惑。對於那些做某事的人來說相當無用。 – 2011-05-16 11:14:27

+1

首先你**需要**才能理解不變性。如果你會一直寫'yourColor = Color.FromArgb(yourColor.A,yourColor.R,100,yourColor.B),代碼會變得更醜。所以這是有用的 – Stecya 2011-05-16 11:18:48

+1

很難理解你認爲對於明確的代碼來說很醜陋。 – 2011-05-16 11:24:33

1
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()); 
     } 
    }