Membangun jawaban saya untuk pertanyaan serupa .
Anda perlu memecah kode hex menjadi 3 bagian untuk mendapatkan intensitas merah, hijau, dan biru individu. Setiap 2 digit kode mewakili nilai dalam notasi heksadesimal (basis-16). Saya tidak akan membahas perincian konversi di sini, mudah dilihat.
Setelah Anda memiliki intensitas untuk masing-masing warna, Anda dapat menentukan intensitas keseluruhan warna dan memilih teks yang sesuai.
if (red*0.299 + green*0.587 + blue*0.114) > 186 use #000000 else use #ffffff
Ambang batas 186 didasarkan pada teori, tetapi dapat disesuaikan dengan selera. Berdasarkan komentar di bawah ambang batas 150 dapat bekerja lebih baik untuk Anda.
Sunting: Di atas sederhana dan berfungsi dengan cukup baik, dan tampaknya memiliki penerimaan yang baik di sini di StackOverflow. Namun, salah satu komentar di bawah ini menunjukkan hal itu dapat menyebabkan ketidakpatuhan terhadap pedoman W3C dalam beberapa keadaan. Dengan ini saya memperoleh formulir yang dimodifikasi yang selalu memilih kontras tertinggi berdasarkan pedoman. Jika Anda
tidak perlu mematuhi aturan W3C maka saya akan tetap menggunakan rumus sederhana di atas.
Rumus yang diberikan untuk kontras dalam Rekomendasi W3C adalah (L1 + 0.05) / (L2 + 0.05)
, di mana L1
luminans warna paling L2
terang dan luminans yang paling gelap pada skala 0,0-1,0. Luminance hitam adalah 0,0 dan putih 1,0, jadi dengan mengganti nilai-nilai itu Anda dapat menentukan nilai dengan kontras tertinggi. Jika kontras untuk hitam lebih besar dari kontras untuk putih, gunakan hitam, jika tidak gunakan putih. Mengingat pencahayaan warna yang Anda uji saat L
tes menjadi:
if (L + 0.05) / (0.0 + 0.05) > (1.0 + 0.05) / (L + 0.05) use #000000 else use #ffffff
Ini disederhanakan secara aljabar menjadi:
if L > sqrt(1.05 * 0.05) - 0.05
Atau kira-kira:
if L > 0.179 use #000000 else use #ffffff
Satu-satunya yang tersisa adalah menghitung L
. Rumus itu juga diberikan dalam pedoman dan sepertinya konversi dari sRGB ke RGB linier diikuti oleh rekomendasi ITU-R BT.709 untuk pencahayaan.
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
Ambang batas 0,179 tidak boleh diubah karena terikat dengan pedoman W3C. Jika Anda menemukan hasilnya tidak sesuai dengan keinginan Anda, coba rumus sederhana di atas.