您好,如何在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.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
对象
Color
结构是 不可变的(实际上所有结构体都应该是这样),这意味着一旦创建了该特定实例,其属性值就无法更改。
相反,您需要使用希望拥有的属性值创建一个新的结构体实例。由于您希望使用其组件 RGB 值创建颜色,因此需要使用 FromArgb
方法:
Color myColor = Color.FromArgb(100, 150, 75);
你必须使用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);
yourColor = Color.FromArgb(yourColor.A,yourColor.R,100,yourColor.B);
,代码会变得更加丑陋。因此,这是有用的。 - StecyaG
,还是还有其他影响。鉴于 Color 结构体的设计,我认为没有什么好的解决方法;如果有一个简单的 ArgbColor 结构体,其中有四个公开的单字节字段,以及一个可隐式转换到 Color
类的 Color
类,则var temp = myColor.AsArgb(); temp.Green=100; myColor = temp;
将清楚地表明,例如,如果 myColor
是一个命名的或系统颜色... - supercatAsArgb
方法过滤掉,但除了那个方法没有被过滤掉的 Green
特性将被保留。实际上,如果定义一个扩展方法来转换为开放字段结构类型,即使使用已定义的 Color
,这种方法也可能可行,并且可能是最好的方法。 - supercat您可以这样做:
Color c = Color.FromArgb(red, green, blue); //red, green and blue are integer variables containing red, green and blue components
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());
}
}