Dựa trên câu trả lời của tôi cho một câu hỏi tương tự .
Bạn cần chia mã hex thành 3 phần để có được cường độ màu đỏ, xanh lục và xanh lam riêng lẻ. Mỗi 2 chữ số của mã đại diện cho một giá trị theo ký hiệu thập lục phân (cơ số-16). Tôi sẽ không tìm hiểu chi tiết về chuyển đổi ở đây, chúng dễ dàng tra cứu.
Khi bạn có cường độ cho từng màu riêng lẻ, bạn có thể xác định cường độ tổng thể của màu và chọn văn bản tương ứng.
if (red*0.299 + green*0.587 + blue*0.114) > 186 use #000000 else use #ffffff
Ngưỡng 186 dựa trên lý thuyết, nhưng có thể được điều chỉnh theo sở thích. Dựa trên các ý kiến dưới ngưỡng 150 có thể phù hợp hơn với bạn.
Chỉnh sửa: Trên đây là đơn giản và hoạt động hợp lý tốt, và dường như có sự chấp nhận tốt ở đây tại StackOverflow. Tuy nhiên, một trong những ý kiến dưới đây cho thấy nó có thể dẫn đến việc không tuân thủ các nguyên tắc của W3C trong một số trường hợp. Dưới đây tôi lấy được một hình thức sửa đổi luôn chọn độ tương phản cao nhất dựa trên các hướng dẫn. Nếu bạn
không cần tuân thủ các quy tắc của W3C thì tôi sẽ sử dụng công thức đơn giản hơn ở trên.
Công thức được đưa ra cho độ tương phản trong Khuyến nghị của W3C là (L1 + 0.05) / (L2 + 0.05)
, trong đó L1
độ chói của màu sáng nhất và L2
là độ chói của màu tối nhất trên thang điểm 0,0-1,0. Độ chói của màu đen là 0,0 và màu trắng là 1,0, vì vậy việc thay thế các giá trị đó cho phép bạn xác định giá trị có độ tương phản cao nhất. Nếu độ tương phản cho màu đen lớn hơn độ tương phản cho màu trắng, hãy sử dụng màu đen, nếu không thì sử dụng màu trắng. Cho độ chói của màu bạn đang kiểm tra khi L
thử nghiệm trở thành:
if (L + 0.05) / (0.0 + 0.05) > (1.0 + 0.05) / (L + 0.05) use #000000 else use #ffffff
Điều này đơn giản hóa đại số xuống:
if L > sqrt(1.05 * 0.05) - 0.05
Hoặc khoảng:
if L > 0.179 use #000000 else use #ffffff
Điều duy nhất còn lại là tính toán L
. Công thức đó cũng được đưa ra trong hướng dẫn và có vẻ như việc chuyển đổi từ sRGB sang RGB tuyến tính theo sau là khuyến nghị BT.709 của ITU-R cho độ chói.
for each c in r,g,b:
c = c / 255.0
if c <= 0.03928 then c = c/12.92 else c = ((c+0.055)/1.055) ^ 2.4
L = 0.2126 * r + 0.7152 * g + 0.0722 * b
Không nên thay đổi ngưỡng 0.179 vì nó được gắn với hướng dẫn của W3C. Nếu bạn thấy kết quả không như ý muốn của mình, hãy thử công thức đơn giản hơn ở trên.