Como verificar se duas estruturas do sistema.Drawing.Color representam a mesma cor com profundidade de cor de 16 bits?
-
25-09-2019 - |
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.
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) )