¿Cómo comprobar si dos estructuras System.Drawing.Color representan el mismo color en una profundidad de color de 16 bits?

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

Pregunta

¿Cómo puedo comprobar si dos estructuras System.Drawing.Color representan el mismo color en profundidad de color de 16 bits (o, en general basado en el valor de Screen.PrimaryScreen.BitsPerPixel)?

digamos conjunto I Form.TransparencyKey Vamos a Valor1 (de tipo de color), quiero comprobar que cuando el usuario selecciona un nuevo color de fondo del formulario (Valor 2), que no establecen la forma entera transparente.

En las pantallas de color de 32 bits de profundidad simplemente comparar los dos valores:

si (Valor1 == Valor2)

Sin embargo, esto no funciona en las pantallas de profundidad de color de 16 bits, a medida que más valores de color para el Valor2 representarían el mismo color de 16 bits real, valor1, como descubrí la manera dura.

¿Fue útil?

Solución

Pruebe el siguiente código:

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

Sólo el violín con el TransparancyKey y BackColor para ver si funciona para usted. Para mí lo hizo. Y sí, sé que es de código hinchada y fea, es sólo pretende ser ejemplo de curso.

Otros consejos

Existen dos formatos de píxeles de color de 16 bits, 555 y 565. Habría que enmascarar, los valores de I G y B con 0xF8 (5 bits) y 0xFC (6 bits) antes de compararlos. Tenga en cuenta que la máquina en la que se ejecuta el diseñador no es representativo de la máquina en la que se ejecuta el programa.

Desde ColorTranslator.ToWin32 se utiliza bajo el capó, funciona esto?

if( ColorTranslator.ToWin32(Value1) == ColorTranslator.ToWin32(Value2) )
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top