Establecer valores de System.Drawing.Color

80

Hola, cómo establecer R G Bvalores 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 Colorobjeto asignando R G Bvalores personalizados

Sudantha
fuente
1
Tenga en cuenta que para otros que lleguen a esta pregunta, este problema solo afecta a System.Drawing. Si está usando WPF, debería usar System.Windows.Media Para obtener más información, consulte esta publicación: stackoverflow.com/questions/2428930/…
HK1

Respuestas:

141

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 .

Darin Dimitrov
fuente
12

La Colorestructura 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 FromArgbmétodo :

Color myColor = Color.FromArgb(100, 150, 75);
Cody Grey
fuente
2
-1 para "como deberían ser todas las estructuras". Buena suerte escribiendo código C.
Dariusz
12
@Dariusz No veo una etiqueta [c] en esta pregunta. Escribo código C todo el tiempo, simplemente no lo escribo de la misma manera que lo hago con mi código C # ...
Cody Gray
9

Debe utilizar el método Color.FromArgb para crear una nueva estructura de color

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

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);
Stecya
fuente
4
Sí, pero no hagas esto. Oculta el hecho de que en realidad está creando una nueva instancia de la estructura, muy confuso para alguien que aún no comprende la inmutabilidad. Y bastante inútil para alguien que lo hace.
Cody Gray
1
En primer lugar, NECESITA comprender la inmutabilidad. El código se vuelve más feo si escribe yourColor = Color.FromArgb(yourColor.A,yourColor.R,100,yourColor.B);todo el tiempo. Entonces es útil
Stecya
1
Es difícil entender qué piensa que es feo sobre el código explícito.
Cody Gray
1
@CodyGray: Un problema importante con escribir todo es que apenas es visualmente obvio si la intención y / o el efecto del código será simplemente cambiar G, 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 una ArgbColorestructura simple con cuatro campos expuestos de un solo byte, y una Colorclase a la que fuera implícitamente convertible, entonces var temp = myColor.AsArgb(); temp.Green=100; myColor = temp;dejaría en claro que si, por ejemplo, myColorhubiera sido un color con nombre o del sistema ...
supercat
1
... que cualquiera de esas características se filtraría mediante el AsArgbmétodo, pero que se conservarían las características distintas de las Greenque 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 la Colordefinición definida y podría ser la mejor manera de hacer las cosas.
supercat
2

Podrías hacerlo:

Color c = Color.FromArgb(red, green, blue); //red, green and blue are integer variables containing red, green and blue components
Panda de fuego
fuente
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());
        }
    }
usuario2991535
fuente