Comment vérifier si deux structures System.Drawing.Color représentent la même couleur dans la profondeur de couleur 16 bits?

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

Question

Comment puis-je vérifier si deux structures de System.Drawing.Color représentent la même couleur dans la profondeur de couleur 16 bits (ou généralement en fonction de la valeur de Screen.PrimaryScreen.BitsPerPixel)?

Disons que je mets Form.TransparencyKey à Valeur1 (de type couleur), je veux vérifier que lorsque l'utilisateur sélectionne une nouvelle couleur d'arrière-plan pour la forme (Valeur2), je ne mets pas tout le formulaire transparent.

Sur les écrans de profondeur de couleur de 32 bits je compare simplement les deux valeurs:

if (valeur1 == valeur2)

Cependant, cela ne fonctionne pas sur les écrans de profondeur de couleur de 16 bits, comme plus de valeurs de couleurs pour les Valeur2 représenterait la même couleur de 16bit réelle Valeur1, comme je l'ai appris à la dure.

Était-ce utile?

La solution

Essayez le code suivant:

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

Il suffit de jouer avec le TransparancyKey et BackColor pour voir si cela fonctionne pour vous. Pour moi, il a fait. Et oui, je sais que c'est pléthorique et le code laid, il est juste conçu comme exemple bien sûr.

Autres conseils

Il existe deux formats de pixels pour la couleur 16 bits, 555 et 565. Vous auriez à masquer le R, G et les valeurs B avec 0xF8 (5 bits) et 0xFC (6 bits) avant de les comparer. Gardez à l'esprit que la machine sur laquelle vous exécutez le concepteur est pas représentatif de la machine sur laquelle le programme fonctionne.

Depuis ColorTranslator.ToWin32 est utilisé sous le capot, cela fonctionne?

if( ColorTranslator.ToWin32(Value1) == ColorTranslator.ToWin32(Value2) )
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top