如何检查两个的System.Drawing.Color结构代表了16位色深的颜色相同?
-
25-09-2019 - |
题
如何检查两个的System.Drawing.Color结构表示在16位颜色深度相同的颜色(或通常基于Screen.PrimaryScreen.BitsPerPixel的值)?
让我们说我组Form.TransparencyKey到值1(彩色型),我要检查的是,当用户选择新的背景颜色的形式(值2),不设置整个形式透明。
在32位颜色深度的屏幕我简单地比较两个值:
如果(值1 ==值2)
不过,这不会对16位色彩深度的屏幕工作,为更多的颜色值的值2将代表相同的实际16bit的颜色值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和背景色拨弄它是否适合你。对我来说,它做到了。是的,我知道它的臃肿,丑陋的代码,它只是意味着作为例子,当然。
其他提示
有两种像素格式为16位颜色,555和565。你必须对它们进行比较之前0xF8的(5个比特)和0xFC有(6个比特)以掩蔽R,G和B值。千万记住其上运行设计师的机器是不是代表的计算机上的程序运行。
由于ColorTranslator.ToWin32被发动机罩下使用的,工作的呢?
if( ColorTranslator.ToWin32(Value1) == ColorTranslator.ToWin32(Value2) )
不隶属于 StackOverflow