Come verificare se due strutture System.Drawing.Color rappresentano lo stesso colore in profondità di colore a 16 bit?
-
25-09-2019 - |
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.
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) )