2010-02-02 63 views
7

如何检查两个System.Drawing.Color结构是否在16位颜色深度(或通常基于Screen.PrimaryScreen.BitsPerPixel的值)中表示相同的颜色?假设我将Form.TransparencyKey设置为Value1(Color类型),我想检查当用户为表单(Value2)选择一个新的背景颜色时,我不会将整个表单设置为透明。如何检查两个System.Drawing.Color结构是否在16位颜色深度中表示相同的颜色?

在32位颜色深度的屏幕我简单地比较两个值:

如果(值==值2)

然而,这并没有对16位色彩深度的屏幕工作,作为值2更多的颜色值将代表与Value1相同的实际16位颜色,因为我发现了困难的方式。

回答

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只是拨弄和背景色,看它是否适合你。对我来说它的确如此。是的,我知道这是膨胀和丑陋的代码,它只是当然作为例子。

+0

只是为了理解,如果你能给我更多关于你为什么用32乘以红色值的细节,绿色值64和蓝色值32?谢谢 – AnAurelian 2010-02-03 10:45:04

+0

出于与nobugz答案相同的原因:Windows中的16位RGB(真实)颜色是从5,6和5位(2到5的幂是32,2到6的幂是64)构建的。因此,如果您将原始红色和蓝色字节除以256并将它们乘以32,则可以得到向下舍入的5位表示。这同样适用于Green的6位。 – Webleeuw 2010-02-04 07:47:34

0

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

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

这不起作用,因为它总是以32位颜色的整数表示。 – Webleeuw 2010-02-02 16:08:02

+0

ColorTranslator.ToWin32的.NET源代码是: "public static int ToWin32(Color c) { return c.R << Win32RedShift | c.G << Win32GreenShift | c.B << Win32BlueShift; }" 其中Win32RedShift = 0; Win32GreenShift = 8; Win32BlueShift = 16; 这可以修改,如在将该值转换为16位颜色深度?更一般地说,一个Screen.PrimaryScreen.BitsPerPixel颜色深度? – AnAurelian 2010-02-03 10:27:16

1

比较之前有你必须与0xF8的(5个比特)和0xFC有(6比特)以掩蔽R,G和B值的两个像素格式16位颜色,555和565。 。请记住,运行设计器的机器对于运行程序的机器不具有代表性。

相关问题