2010-02-02 19 views
7

Làm thế nào tôi có thể kiểm tra xem hai cấu trúc System.Drawing.Color có cùng màu với độ sâu màu 16 bit (hay thường dựa trên giá trị của Screen.PrimaryScreen.BitsPerPixel)?Làm thế nào để kiểm tra xem hai cấu trúc System.Drawing.Color có biểu thị cùng màu với độ sâu màu 16 bit không?

Giả sử tôi đặt Form.TransparencyKey thành Value1 (thuộc loại màu), tôi muốn kiểm tra khi người dùng chọn màu nền mới cho biểu mẫu (Value2), tôi không đặt toàn bộ biểu mẫu trong suốt.

Trên màn hình sâu 32bit màu Tôi chỉ đơn giản là so sánh hai giá trị:

if (Value1 == Value2)

Tuy nhiên, điều này không hoạt động trên màn hình sâu 16bit màu, như các giá trị màu hơn cho Value2 sẽ đại diện cho cùng một màu 16bit thực như Value1, khi tôi phát hiện ra một cách khó khăn.

Trả lời

1

Hãy thử đoạn mã sau:

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); 
} 

Chỉ cần fiddle với TransparancyKey và BackColor để xem nếu nó làm việc cho bạn. Đối với tôi nó đã làm. Và vâng, tôi biết đó là mã cồng kềnh và xấu xí, nó chỉ có nghĩa là ví dụ về khóa học.

+0

Chỉ cần hiểu, nếu bạn có thể cho tôi biết thêm chi tiết về lý do tại sao bạn nhân giá trị màu đỏ với 32, giá trị màu xanh lá cây với 64 và giá trị màu xanh với 32? Cảm ơn – AnAurelian

+0

Với cùng một lý do như câu trả lời của nobugz: màu RGB 16 bit (đúng) trong Windows được xây dựng từ 5, 6 và 5 bit (2 đến sức mạnh của 5 là 32, 2 với công suất 6 là 64). Do đó, nếu bạn chia các byte màu đỏ và xanh ban đầu cho 256 và nhân chúng với 32, bạn sẽ nhận được biểu diễn 5 bit được làm tròn xuống. Điều tương tự cũng áp dụng cho 6 bit của Green. – Webleeuw

0

Vì ColorTranslator.ToWin32 được sử dụng dưới mui xe, tính năng này có hoạt động không?

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

Điều đó sẽ không hoạt động, bởi vì nó luôn dẫn đến một biểu diễn số nguyên của màu 32 bit. – Webleeuw

+0

Nguồn .NET cho ColorTranslator.ToWin32 là: "public static int ToWin32(Color c) { return c.R << Win32RedShift | c.G << Win32GreenShift | c.B << Win32BlueShift; }" nơi Win32RedShift = 0; Win32GreenShift = 8; Win32BlueShift = 16; Điều này có thể được sửa đổi như vậy trong việc chuyển đổi giá trị thành độ sâu màu 16 bit không? Và nói chung, với độ sâu màu của Screen.PrimaryScreen.BitsPerPixel? – AnAurelian

1

Có hai định dạng pixel màu 16-bit, 555 và 565. Bạn sẽ phải che R, G và B giá trị với 0xf8 (5 bit) và 0xfc (6 bit) trước khi so sánh chúng . Hãy nhớ rằng máy mà bạn chạy trình thiết kế không đại diện cho máy mà chương trình của bạn chạy.