Come verificare se due strutture System.Drawing.Color rappresentano lo stesso colore in profondità di colore a 16 bit?

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

Domanda

Come posso verificare se due strutture System.Drawing.Color rappresentano lo stesso colore in profondità di colore a 16 bit (o in generale in base al valore di Screen.PrimaryScreen.BitsPerPixel)?

Let dire che ho impostato Form.TransparencyKey a Value1 (di tipo a colori), voglio verificare che quando l'utente seleziona un nuovo colore di sfondo per la forma (Valore2), io non impostano l'intera forma trasparente.

Nelle schermate di profondità colore a 32 bit ho semplicemente confrontare i due valori:

if (Valore1 Valore2 ==)

Tuttavia, questo non funziona su schermi di profondità di colore a 16 bit, come più valori di colore per il Valore2 rappresenterebbero lo stesso colore a 16 bit attuale Valore1, come ho scoperto nel modo più duro.

È stato utile?

Soluzione

Prova il seguente codice:

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);
}

Proprio violino con il TransparancyKey e BackColor per vedere se funziona per voi. Per me lo ha fatto. E sì, lo so che è il codice gonfio e brutto, è solo inteso come esempio di corso.

Altri suggerimenti

Ci sono due formati di pixel per colore a 16 bit, 555 e 565. dovreste mascherare la R, G e B i valori con 0xF8 (5 bit) e 0xFC (6 bit) prima di confrontarli. Non tenere a mente che la macchina su cui si esegue il progettista non è rappresentativo per la macchina su cui le corse del programma.

Dal ColorTranslator.ToWin32 viene utilizzato sotto il cofano, fa questo lavoro?

if( ColorTranslator.ToWin32(Value1) == ColorTranslator.ToWin32(Value2) )
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top