2010-02-11 24 views
31

Điều gì đó giống như tính giá trị trung bình của các thành phần rgb và sau đó quyết định có sử dụng màu đen hoặc trắng không?Làm cho foregroundcolor màu đen hoặc trắng tùy thuộc vào nền

Tôi có phải chuyển đổi RGB thành HSV trong bước đầu tiên 'vì RGB không phải lúc nào cũng nhìn vào mắt người?

Tôi đang sử dụng C#

+2

Câu hỏi này chứa câu trả lời sẽ hỗ trợ bạn: http://stackoverflow.com/questions/946544/good-text-foreground-color-for-a-given-background-color/946570 –

+0

Liên quan (nhưng tự lừa dối) : http://stackoverflow.com/questions/3116260/given-a-background-color-how-to-get-a-foreground-color-that-make-it-readable-on http://stackoverflow.com/ question/3942878/how-to-decision-font-màu-trong-trắng-hoặc-đen-phụ thuộc-trên-nền-màu – JYelton

Trả lời

3

thì sao?

private static Color GetReadableForeColor(Color c) 
{ 
    return (((c.R + c.B + c.G)/3) > 128) ? Color.Black : Color.White; 
} 
+1

Hãy thử điều này bằng cách sử dụng các giá trị sau: 128, 255, 0. Đó là màu xanh lục nhạt dễ đọc hơn so với nền đen. Tuy nhiên, giá trị trung bình là 127, mà phương thức của bạn sẽ trả về màu trắng. – JYelton

0

Bạn có thể làm một phép tính đơn giản phụ thuộc vào độ sâu màu, nếu nói rằng bạn đã có một định dạng #FFFFFF màu sắc, bạn chỉ có thể thêm các giá trị RGB và tính toán nếu họ dưới một nửa .

Các tối đa trong trường hợp đó là 255 (F x F = 256) quân đầu người, vì vậy chỉ cần kiểm tra xem nó dưới ngưỡng rằng:

var colorCode = ((R + B + G) < 255*3) ? "#FFFFFF" : "#000000"; 

Nếu màu sắc là dưới đây, nó sẫm màu ... sử dụng một nền trắng . Nếu nó ở trên, nó nhẹ hơn ... sử dụng một nền đen. Nó không hoàn hảo, nhưng là một ý tưởng để bắt đầu.

+0

Tôi đã thử một cái gì đó như thế này ban đầu trong dự án của tôi, và nó dẫn đến một số trường hợp nơi màu trắng/nhãn đen không đáng chú ý so với màu nền của chúng. – JYelton

59

Nó chỉ như vậy xảy ra tôi cần chức năng này cho một dự án cách đây không lâu.

private int PerceivedBrightness(Color c) 
{ 
    return (int)Math.Sqrt(
    c.R * c.R * .241 + 
    c.G * c.G * .691 + 
    c.B * c.B * .068); 
} 

Công thức này tôi tìm thấy trên web tại Nbd Tech xử lý màu sắc và công thức chuyển đổi màu. Trang web cung cấp rất nhiều thông tin hữu ích.

Dưới đây là làm thế nào để sử dụng này để chọn màu đen hoặc trắng:

var foreColor = (PerceivedBrightness(backColor) > 130 ? Color.Black : Color.White); 

Bạn có thể sử dụng một giá trị không phải là 130 như cắt; nó là sở thích.


Cập nhật: Theo Darel Rex Finley tại his site:

Các giá trị tôi đã đưa ra bằng cách chơi với Photoshop đã thực sự 0,241, 0,691, và 0,068, nhưng tôi có kể từ khi được thông báo rằng các giá trị .299, .587 và .114 là chính xác hơn.

Đặc điểm kỹ thuật này theo sau ITU-R Recommendation BT.601 (hoặc viết tắt là Rec. 601). Trang web tôi đã đề cập ở trên, Nbd Tech, chưa được cập nhật để phản ánh điều này.

Dựa trên điều này, đây là cập nhật phương pháp (nhờ DTI-thi-ơ cho bình luận):

private int PerceivedBrightness(Color c) 
{ 
    return (int)Math.Sqrt(
    c.R * c.R * .299 + 
    c.G * c.G * .587 + 
    c.B * c.B * .114); 
} 

Lưu ý về sở thích ngưỡng:

Màu sắc với một độ sáng nhận thức gần giữa (ví dụ 120-140) sẽ chủ quan hơn. Ví dụ, nó gây tranh cãi cho dù màu đỏ (FF0000), mà đánh giá đến 139, là rõ ràng hơn với một lớp phủ màu đen hoặc trắng.

White and Black on Red

+0

Điều này về cơ bản là công thức cho luma, giá trị bình phương để cung cấp cho các ngoại lệ nhiều trọng lượng hơn. Kết quả là thang tỷ lệ 0-255. http://en.wikipedia.org/wiki/Luma_%28video%29 –

+2

** LƯU Ý: ** Nguồn cho các giá trị này đã được cập nhật: http://alienryderflex.com/hsp.html Hiện chúng được hiển thị như: 'R: .299'' G: .587' 'B: .114' –

+0

@DTI Cảm ơn lời khuyên, tôi đã cập nhật câu trả lời. – JYelton

-1

Nếu tôi hiểu một cách chính xác, một cách tiếp cận có thể là để có được giữ của hình nền máy tính để bàn, kiểm tra tại một số dinh thự màu gì nó là gì và sau đó thay đổi màu ứng dụng của bạn dựa trên đó.

Có một bài viết on geekpedia về việc tổ chức của hình nền máy tính để bàn hiện nay (và rất nhiều hit trên google trên đó), nhưng tiền đề cơ bản là để lấy các giá trị registry của giấy dán tường hiện tại:

RegistryKey rkWallPaper = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", false); 
string WallpaperPath = rkWallPaper.GetValue("WallPaper").ToString(); 

Bạn sau đó có thể sử dụng đường dẫn đó để mở hình ảnh. Sau đó, bạn có thể giữ nhiều thuộc tính, chẳng hạn như kích thước và màu pixel riêng lẻ trong RGB.

Để tìm hiểu xem "màu trắng" hay "đen hơn", bạn có nhiều tùy chọn.

Một ý tưởng sẽ là nhận từng màu pixel trong RGB, trung bình các giá trị (để lấy giá trị thang độ xám) và sau đó trung bình giá trị thang độ xám của mỗi pixel trên hình ảnh. Nếu điều này xuất hiện> 128 thì có thể được coi là "trắng". Nếu < 128 thì "đen". Về cơ bản bạn đang quyết định bên nào của đường phân chia màu xám giữa các cường độ điểm ảnh trung bình ra ngoài.

// Psudo code - can't check the C# spec atm. 
foreach(Pixel p in image) 
{ 
    // get average of colour components. 
    double greyScale = (p.Red + p.Green + p.Blue)/3; 
    totalIntensity += greyScale; 
} 

double averageImageIntensity = totalIntensity/image.NumPixels; 

if(totalIntensity > 128) // image could be considered to be "white" 
else // image could be considered "black". 

Vấn đề: có thể là một thủ tục chậm, bạn có thể chỉ muốn lấy mẫu một số pixel (ví dụ, mỗi thứ 10, v.v.) để tiết kiệm thời gian. Nói chung, nó có vẻ giống như một điều khá khó khăn để làm gì cả. Việc kéo các tệp người dùng vào thời gian chạy và gây rối với chúng hầu như không sạch sẽ và nó cung cấp các mối quan tâm về bảo mật và ổn định tiềm ẩn. Điều gì sẽ xảy ra nếu hình ảnh là duff hoặc tham nhũng, vv ..

Cá nhân tôi khuyên bạn chỉ nên cho người dùng lựa chọn màu sắc/chủ đề/da, hoặc tốt hơn nhưng hãy để họ tùy chỉnh!

+0

Tôi không muốn thay đổi toàn bộ màu ứng dụng. Tôi đang sử dụng một listview trong đó các mục có màu bg và văn bản của mỗi mục nên có thể đọc được ... – Kai

3

Cấu trúc Color hỗ trợ chuyển đổi thành HSB nguyên bản.

if (Color.GetBrightness() > 0.5f) { 
    // win 
} 

Bạn cũng có thể thêm thành phần bão hòa, xem xét độ bão hòa cũng góp phần vào 'độ sáng' rõ ràng.

Các vấn đề liên quan