如何检查两个System.Drawing.Color结构是否代表16位颜色深度的相同颜色?

时间:2010-02-02 14:18:02

标签: c# winforms colors system.drawing.color 16-bit

如何检查两个System.Drawing.Color结构是否代表16位颜色深度的相同颜色(或者通常基于Screen.PrimaryScreen.BitsPerPixel的值)?

假设我将Form.TransparencyKey设置为Value1(Color类型),我想检查当用户为表单选择新的背景颜色(Value2)时,我不会将整个表单设置为透明。

在32位色深屏幕上,我只是比较两个值:

if(Value1 == Value2)

然而,这不适用于16位彩色深度屏幕,因为Value2的更多Color值将代表与Value1相同的实际16位颜色,正如我发现的那样。

3 个答案:

答案 0 :(得分:1)

16位颜色有两种像素格式,555和565.在比较它们之前,您必须使用0xf8(5位)和0xfc(6位)屏蔽R,G和B值。请记住,运行设计器的机器不能代表程序运行的机器。

答案 1 :(得分:1)

请尝试以下代码:

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

只需摆弄TransparancyKey和BackColor,看它是否适合你。对我来说确实如此。是的,我知道这是臃肿而丑陋的代码,当然这只是一个例子。

答案 2 :(得分:0)

由于引擎使用ColorTranslator.ToWin32,这有用吗?

if( ColorTranslator.ToWin32(Value1) == ColorTranslator.ToWin32(Value2) )