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

C# 如何检查两个System.Drawing.Color结构在16位颜色深度中是否表示相同的颜色?,c#,winforms,colors,system.drawing.color,16-bit,C#,Winforms,Colors,System.drawing.color,16 Bit,如何检查两个System.Drawing.Color结构在16位颜色深度中是否表示相同的颜色(或通常基于Screen.PrimaryScreen.BitsPerPixel的值) 假设我将Form.TransparencyKey设置为Value1(颜色类型),我想检查当用户为表单选择新的背景颜色(Value2)时,我是否没有将整个表单设置为透明 在32位颜色深度屏幕上,我只需比较两个值: 如果(值1==值2) 但是,这在16位颜色深度屏幕上不起作用,因为正如我艰难发现的那样,值2的更多颜色值将表示

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

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

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

如果(值1==值2)


但是,这在16位颜色深度屏幕上不起作用,因为正如我艰难发现的那样,值2的更多颜色值将表示与值1相同的实际16位颜色。

由于ColorTranslator.ToWin32在引擎盖下使用,这是否起作用

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

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

请尝试以下代码:

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,看看它是否适合您。对我来说确实如此。是的,我知道这是一个臃肿难看的代码,这只是一个例子。

这行不通,因为它总是导致32位颜色的整数表示。ColorTranslator.ToWin32的.NET源代码是:
“public static int ToWin32(color c){返回c.R只是为了理解,如果你能告诉我更多细节,为什么你要将红色值乘以32,绿色值乘以64,蓝色值乘以32?感谢nobugz回答的相同原因:Windows中的16位RGB(真)颜色是从5、6和5位(2到5的幂是32,2到6的幂是64)建立起来的。因此,如果将原始的红色和蓝色字节除以256,再乘以32,则得到向下舍入的5位表示形式。绿色的6位也是如此。