Wie kann man überprüfen, ob zwei System.Drawing.Color Strukturen die gleiche Farbe in 16 Bit Farbtiefe darstellen?

StackOverflow https://stackoverflow.com/questions/2184624

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.

War es hilfreich?

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) )
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top