如何检查两个的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) )
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top