如何检查两个System.Drawing.Color结构是否代表16位颜色深度的相同颜色(或者通常基于Screen.PrimaryScreen.BitsPerPixel的值)?
假设我将Form.TransparencyKey设置为Value1(Color类型),我想检查当用户为表单选择新的背景颜色(Value2)时,我不会将整个表单设置为透明。
在32位色深屏幕上,我只是比较两个值:
if(Value1 == Value2)
然而,这不适用于16位彩色深度屏幕,因为Value2的更多Color值将代表与Value1相同的实际16位颜色,正如我发现的那样。
答案 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) )