Hallo, wie man R G B
Werte einstellt System.Drawing.Color.G
?
Das ist wie System.Drawing.Color.G=255;
nicht erlaubt, weil es schreibgeschützt ist
Property or indexer 'System.Drawing.Color.G' cannot be assigned toit is read only
Ich muss nur ein Color
Objekt erstellen, indem ich benutzerdefinierte R G B
Werte zuweise
c#
.net
colors
immutability
system.drawing.color
Sudantha
quelle
quelle
Antworten:
Sie können eine Farbe mit der statischen FromArgb- Methode erstellen :
Color redColor = Color.FromArgb(255, 0, 0);
Sie können das Alpha auch mithilfe der folgenden Überladung angeben .
quelle
Die
Color
Struktur ist unveränderlich (wie es eigentlich alle Strukturen sein sollten), was bedeutet, dass die Werte ihrer Eigenschaften nicht geändert werden können, sobald diese bestimmte Instanz erstellt wurde.Stattdessen müssen Sie eine neue Instanz der Struktur mit den gewünschten Eigenschaftswerten erstellen . Da Sie eine Farbe mit ihren Komponenten-RGB-Werten erstellen möchten, müssen Sie die folgende
FromArgb
Methode verwenden :Color myColor = Color.FromArgb(100, 150, 75);
quelle
Sie müssen die Color.FromArgb-Methode verwenden, um eine neue Farbstruktur zu erstellen
var newColor = Color.FromArgb(0xCC,0xBB,0xAA);
quelle
Sie können eine Erweiterung vornehmen, um nur eine Farbkomponente zu ändern
static class ColorExtension { public static Color ChangeG(Color this color,byte g) { return Color.FromArgb(color.A,color.R,g,color.B); } }
dann können Sie dies verwenden:
yourColor = yourColor.ChangeG(100);
quelle
yourColor = Color.FromArgb(yourColor.A,yourColor.R,100,yourColor.B);
ganze Zeit schreiben . Also ist es nützlichG
, oder ob er auch andere Auswirkungen hat. Angesichts des Designs der Farbstruktur gibt es meines Erachtens keinen guten Weg, dies zu beheben. Wenn es eine einfacheArgbColor
Struktur mit vier exponiertenColor
var temp = myColor.AsArgb(); temp.Green=100; myColor = temp;
myColor
AsArgb
Methode herausgefiltert würden, andere Merkmale,Green
die nicht durch diese Methode herausgefiltert worden waren, jedoch beibehalten würden. Wenn man eine Erweiterungsmethode definiert, die in den Open-Field-Strukturtyp konvertiert werden soll, kann dieser Ansatz sogar mitColor
der definierten Methode funktionieren und der beste Weg sein, Dinge zu tun.Du könntest es tun:
Color c = Color.FromArgb(red, green, blue); //red, green and blue are integer variables containing red, green and blue components
quelle
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()); } }
quelle