2009-09-29 22 views
9

Tôi có biểu mẫu Opacity 60%. Và khi người dùng thay đổi màu sắc của biểu mẫu, đôi khi (tùy thuộc vào màu đã chọn), họ không thể thấy văn bản trên biểu mẫu nữa vì nó quá gần giống với màu của biểu mẫu. Vì vậy, tôi đang cố gắng để làm có thể một nếu/chuyển đổi để xem nếu BackColor được lựa chọn của hình thức là một trong hai tối, hoặc ánh sáng. Nếu nó là Tối, thì tất cả văn bản trên biểu mẫu phải là Màu trắng. Nếu đó là Light, thì tất cả văn bản trên biểu mẫu phải là Đen.Nếu Biểu mẫu tối, thì Văn bản trên biểu mẫu phải là Ánh sáng

Điều này có thể thực hiện được không? Tôi đã nhìn thấy điều này trên tất cả các nơi nhưng không chắc chắn những gì để tìm kiếm mà không cần viết toàn bộ câu hỏi trong lĩnh vực tìm kiếm.

Bất kỳ trợ giúp/đề xuất nào sẽ được đánh giá rất nhiều.

Xin cảm ơn, jason.

+0

có một giải pháp [ở đây] (http://stackoverflow.com/a/2509596/779408) – breceivemail

Trả lời

7

Bạn có thể kiểm tra, nếu tổng của ba rgb-giá trị là trên một nửa số max-giá trị

-> vì 255.255.255 trắng == (ánh sáng) và 0,0,0 == đen (tối) :

fe

R 255 
G 140 
B 170 
===== 
    565 

Max: 765 (Trung 382) Sum: 565

Bởi vì số tiền là 565 và cao hơn giữa (tối ánh sáng), màu sắc là ánh sáng. Vì vậy, bạn có thể thay đổi màu văn bản thành tối.

+0

Cảm ơn bạn @Lichtamberg, ban đầu tôi đã nghĩ về điều này nhưng sau đó đã cố gắng thuyết phục bản thân rằng nó sẽ không hoạt động. Nhưng nó, nhiều đánh giá cao. –

+1

Điều đó sẽ làm cho màu vàng tối như nó (255, 255, 0). –

+0

bạn nói đúng ... – Lichtamberg

18

Làm thế nào để sử dụng Color.GetBrightness() để tìm ra ánh sáng như thế nào?

+0

Cảm ơn bạn @ Jon . Nhiều đánh giá cao. :) –

3

Phương pháp này kiểm tra xem độ tương phản của hai màu sắc là có thể đọc được:

public static bool ContrastReadableIs(Color color_1, Color color_2) 
{ 
    // Maximum contrast would be a value of "1.0f" which is the brightness 
    // difference between "Color.Black" and "Color.White" 
    float minContrast = 0.5f; 

    float brightness_1 = color_1.GetBrightness(); 
    float brightness_2 = color_2.GetBrightness(); 

    // Contrast readable? 
    return (Math.Abs(brightness_1 - brightness_2) >= minContrast); 
} 

Có backcolor tìm kiếm một ForeColor có thể đọc được?
Here là cách tiếp cận đơn giản và khá tốt để đảo ngược màu nền.
NB: Đảo ngược này không có nghĩa là màu sắc và màu đảo ngược khác nhau về độ sáng, nhưng nếu hai màu khác nhau về độ sáng ít nhất 0,5, chúng thường hiển thị độ tương phản có thể đọc được.

Button with text "Am I readable?"

mã kiểm tra cho handler nhấp chuột button1

Random r = new Random(); 

while (1 < 2) 
{ 
    // Get a random fore- and backcolor 
    Color foreColor = Color.FromArgb(r.Next(0, 256), r.Next(0, 256), r.Next(0, 256)); 
    Color backColor = Color.FromArgb(r.Next(0, 256), r.Next(0, 256), r.Next(0, 256)); 

    // Contrast readable? 
    if (ContrastReadableIs(foreColor, backColor)) 
    { 
     button1.ForeColor = foreColor; 
     button1.BackColor = backColor; 
     System.Media.SystemSounds.Beep.Play(); 
     break; 
    } 
} 
Các vấn đề liên quan