Tôi gặp sự cố tương tự. Tôi đã phải tìm một phương pháp tốt để chọn màu phông chữ tương phản để hiển thị nhãn văn bản trên colorcales/heatmaps. Nó phải là phương pháp phổ quát và màu sắc được tạo ra phải "đẹp trai", có nghĩa là màu bổ sung tạo ra đơn giản không phải là giải pháp tốt - đôi khi nó tạo ra những màu lạ, rất chuyên sâu khó xem và đọc.
Sau nhiều giờ thử nghiệm và cố gắng giải quyết vấn đề này, tôi phát hiện ra rằng giải pháp tốt nhất là chọn phông chữ màu trắng cho màu "tối" và phông chữ màu đen cho màu "sáng".
Dưới đây là một ví dụ về chức năng Tôi đang sử dụng trong C#:
Color ContrastColor(Color color)
{
int d = 0;
// Counting the perceptive luminance - human eye favors green color...
double a = 1 - (0.299 * color.R + 0.587 * color.G + 0.114 * color.B)/255;
if (a < 0.5)
d = 0; // bright colors - black font
else
d = 255; // dark colors - white font
return Color.FromArgb(d, d, d);
}
này đã được thử nghiệm cho nhiều colorscales khác nhau (cầu vồng, màu xám, nhiệt, nước đá, và nhiều người khác) và chỉ là phương pháp "phổ quát" Tôi phát hiện ra.
Sửa
Thay đổi công thức đếm a
để "sáng sâu sắc" - nó thực sự trông tốt hơn! Đã triển khai nó trong phần mềm của tôi, trông rất tuyệt.
Chỉnh sửa 2 @WebSeed cung cấp một ví dụ làm việc vĩ đại của thuật toán này: http://codepen.io/WebSeed/full/pvgqEq/
Nó có lẽ không quan trọng, nhưng bạn có thể muốn có một chức năng tốt hơn để tính toán độ sáng http: // stackoverflow.com/questions/596216/công thức-để-xác định-độ sáng-of-rgb-màu –
Điều này có vẻ như nó sẽ được hoàn hảo. –
Cải thiện mã - bây giờ thậm chí còn tốt hơn – Gacek