Como verificar se duas estruturas do sistema.Drawing.Color representam a mesma cor com profundidade de cor de 16 bits?

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

Pergunta

Como posso verificar se duas estruturas de sistema.Drawing.Color representam a mesma cor com profundidade de cor de 16 bits (ou geralmente com base no valor da tela.PrimaryScreen.bitsPixel)?

Digamos que eu defina o formulário.TransparencyKey para value1 (do tipo de cor), quero verificar se o usuário selecionar uma nova cor de fundo para o formulário (valor2), não defino todo o formulário transparente.

Nas telas de profundidade de cores de 32 bits, eu simplesmente comparo os dois valores:

if (value1 == value2)

No entanto, isso não funciona em telas de profundidade de cores de 16 bits, pois mais valores de cores para o valor2 representariam a mesma cor de 16 bits que o valor1, como eu descobri da maneira mais difícil.

Foi útil?

Solução

Experimente o seguinte 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);
}

Basta mexer com o TransparancyKey e Backcolor para ver se funciona para você. Para mim, fez. E sim, eu sei que é um código inchado e feio, apenas significa exemplo, é claro.

Outras dicas

Existem dois formatos de pixel para cores de 16 bits, 555 e 565. Você precisaria mascarar os valores R, G e B com 0xf8 (5 bits) e 0xfc (6 bits) antes de compará-los. Lembre -se de que a máquina na qual você executa o designer não é representativa da máquina na qual seu programa é executado.

Como o colortranslator.towin32 é usado sob o capô, isso funciona?

if( ColorTranslator.ToWin32(Value1) == ColorTranslator.ToWin32(Value2) )
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top