Hola, cómo establecer R G B
valores enSystem.Drawing.Color.G
?
que es como System.Drawing.Color.G=255;
no está permitido porque es de solo lectura
Property or indexer 'System.Drawing.Color.G' cannot be assigned toit is read only
solo necesito crear un Color
objeto asignando R G B
valores personalizados
c#
.net
colors
immutability
system.drawing.color
Sudantha
fuente
fuente
Respuestas:
Puede crear un color utilizando el método estático FromArgb :
Color redColor = Color.FromArgb(255, 0, 0);
También puede especificar el alfa utilizando la siguiente sobrecarga .
fuente
La
Color
estructura es inmutable (como deberían ser todas las estructuras), lo que significa que los valores de sus propiedades no se pueden cambiar una vez que se ha creado esa instancia en particular.En su lugar, debe crear una nueva instancia de la estructura con los valores de propiedad que desee. Dado que desea crear un color utilizando sus valores RGB componentes, debe usar el
FromArgb
método :Color myColor = Color.FromArgb(100, 150, 75);
fuente
Debe utilizar el método Color.FromArgb para crear una nueva estructura de color
var newColor = Color.FromArgb(0xCC,0xBB,0xAA);
fuente
Puede hacer una extensión para cambiar solo un componente de color
static class ColorExtension { public static Color ChangeG(Color this color,byte g) { return Color.FromArgb(color.A,color.R,g,color.B); } }
entonces puedes usar esto:
yourColor = yourColor.ChangeG(100);
fuente
yourColor = Color.FromArgb(yourColor.A,yourColor.R,100,yourColor.B);
todo el tiempo. Entonces es útilG
, o si también tendrá otros efectos. Dado el diseño de la estructura Color, no creo que haya ninguna forma agradable de solucionarlo; si hubiera habido unaArgbColor
estructura simple con cuatro campos expuestos de un solo byte, y unaColor
clase a la que fuera implícitamente convertible, entoncesvar temp = myColor.AsArgb(); temp.Green=100; myColor = temp;
dejaría en claro que si, por ejemplo,myColor
hubiera sido un color con nombre o del sistema ...AsArgb
método, pero que se conservarían las características distintas de lasGreen
que no se habían filtrado mediante ese método. En realidad, si uno define un método de extensión para convertir al tipo de estructura de campo abierto, ese enfoque podría funcionar incluso con laColor
definición definida y podría ser la mejor manera de hacer las cosas.Podrías hacerlo:
Color c = Color.FromArgb(red, green, blue); //red, green and blue are integer variables containing red, green and blue components
fuente
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()); } }
fuente