Wie kann man überprüfen, ob zwei System.Drawing.Color Strukturen die gleiche Farbe in 16 Bit Farbtiefe darstellen?
-
25-09-2019 - |
Frage
Wie kann ich überprüfen, ob zwei System.Drawing.Color Strukturen die gleiche Farbe in 16 Bit Farbtiefe darstellen (oder allgemein basierend auf dem Wert von Screen.PrimaryScreen.BitsPerPixel)?
Sagen wir, ich Satz Form.TransparencyKey zu Value1 (von Farbtyp), ich möchte überprüfen, ob, wenn der Benutzer wählt einen neuen Hintergrundfarbe für das Formular (Wert2), ich transparent das gesamte Formular nicht festgelegt.
Auf 32-Bit-Farbtiefe Bildschirme Ich vergleiche nur die beiden Werte:
if (Value1 == Wert2)
Dies ist jedoch funktioniert nicht auf 16-Bit-Farbtiefe Bildschirme, da mehr Farbwerte für die Value2 die gleiche tatsächliche 16bit Farbe wie Value1 darstellen würde, wie ich auf die harte Tour herausgefunden haben.
Lösung
Versuchen Sie, den folgenden Code:
void MyTestMethod() {
TransparencyKey = Color.FromArgb(128, 128, 64);
BackColor = Color.FromArgb(128, 128, 71);
byte tR = ConvertR(TransparencyKey.R);
byte tG = ConvertG(TransparencyKey.G);
byte tB = ConvertB(TransparencyKey.B);
byte bR = ConvertR(BackColor.R);
byte bG = ConvertG(BackColor.G);
byte bB = ConvertB(BackColor.B);
if (tR == bR &&
tG == bG &&
tB == bB) {
MessageBox.Show("Equal: " + tR + "," + tG + "," + tB + "\r\n" +
bR + "," + bG + "," + bB);
}
else {
MessageBox.Show("NOT Equal: " + tR + "," + tG + "," + tB + "\r\n" +
bR + "," + bG + "," + bB);
}
}
byte ConvertR(byte colorByte) {
return (byte)(((double)colorByte / 256.0) * 32.0);
}
byte ConvertG(byte colorByte) {
return (byte)(((double)colorByte / 256.0) * 64.0);
}
byte ConvertB(byte colorByte) {
return (byte)(((double)colorByte / 256.0) * 32.0);
}
Just Geige mit dem TransparancyKey und Backcolor, um zu sehen, ob es für Sie arbeitet. Für mich hat es geschafft. Und ja, ich weiß, es ist aufgebläht und hässlich Code, es ist nur als Beispiel natürlich gemeint.
Andere Tipps
Es gibt zwei Pixelformate für 16-Bit-Farbe, 555 und 565. Sie haben würden die R-, G- und B-Werte mit 0xF8 (5 Bits) und 0xfc (6 Bits) zu maskieren, bevor sie zu vergleichen. Bewahren Sie daran, dass die Maschine, auf der Sie den Designer laufen für die Maschine nicht repräsentativ ist, auf dem das Programm ausgeführt wird.
Da ColorTranslator.ToWin32 ist unter der Haube verwendet, funktionierts?
if( ColorTranslator.ToWin32(Value1) == ColorTranslator.ToWin32(Value2) )