嗨如何设置R G B
值System.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
对象
嗨如何设置R G B
值System.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
对象
的Color
结构不变(就像所有的结构确实应该),这意味着一旦该特定实例已创建其属性的值不能改变。
取而代之,您需要创建一个新的具有所需属性值的结构实例。既然你想用它的分量RGB值创建一个颜色,你需要使用FromArgb
method:
Color myColor = Color.FromArgb(100, 150, 75);
-1“因为所有结构都应该是真实的”。祝你好运写一些C代码。 – Dariusz 2013-01-30 07:51:22
@Dariusz我在这个问题上看不到[c]标签。我一直在写C代码,我只是不会像我的C#代码那样编写代码... – 2013-04-21 12:27:58
你可以这样做:
Color c = Color.FromArgb(red, green, blue); //red, green and blue are integer variables containing red, green and blue components
您必须使用Color.FromArgb方法来创建新的颜色结构
var newColor = Color.FromArgb(0xCC,0xBB,0xAA);
您可以扩展到只是改变一个颜色分量
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);
是的,但不要这样做。它隐藏了一个事实,即您实际上正在创建一个新的结构实例,对于不了解不变性的人非常困惑。对于那些做某事的人来说相当无用。 – 2011-05-16 11:14:27
首先你**需要**才能理解不变性。如果你会一直写'yourColor = Color.FromArgb(yourColor.A,yourColor.R,100,yourColor.B),代码会变得更丑。所以这是有用的 – Stecya 2011-05-16 11:18:48
很难理解你认为对于明确的代码来说很丑陋。 – 2011-05-16 11:24:33
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());
}
}
注意别人说来这个问题,这个问题只影响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