Benzer bir soruya verdiğim cevaba dayanarak .
Bireysel kırmızı, yeşil ve mavi yoğunluklarını elde etmek için hex kodunu 3 parçaya bölmeniz gerekir. Kodun her 2 basamağı onaltılık (taban-16) gösterimdeki bir değeri temsil eder. Burada dönüşümün ayrıntılarına girmeyeceğim, aramaları kolaydır.
Tek tek renkler için yoğunluklara sahip olduğunuzda, rengin toplam yoğunluğunu belirleyebilir ve ilgili metni seçebilirsiniz.
if (red*0.299 + green*0.587 + blue*0.114) > 186 use #000000 else use #ffffff
186 eşiği teoriye dayanır, ancak tada göre ayarlanabilir. Aşağıdaki yorumlara dayanarak 150 eşiği sizin için daha iyi çalışabilir.
Düzenleme: Yukarıdaki basit ve oldukça iyi çalışıyor ve burada StackOverflow iyi kabul gibi görünüyor. Bununla birlikte, aşağıdaki yorumlardan biri, bazı durumlarda W3C yönergelerine uyulmamasına neden olabileceğini göstermektedir. Bu vesileyle, kurallara göre her zaman en yüksek kontrastı seçen değiştirilmiş bir form elde ediyorum. Eğer varsa
yok W3C kurallarına uyması gerekir o zaman ben yukarıdaki basit formülü ile sopa olur.
Kontrast için verilen formül W3C Öneriler olup (L1 + 0.05) / (L2 + 0.05)
burada, L1
en açık renk parlaklığının ve L2
0.0-1.0 bir ölçekte karanlık parlaklığı olan. Siyahın parlaklığı 0.0 ve beyaz 1.0'dır, bu nedenle bu değerlerin değiştirilmesi en yüksek kontrastlı olanı belirlemenizi sağlar. Siyahın kontrastı beyazın kontrastından büyükse, siyah kullanın, aksi takdirde beyaz kullanın. L
Test olurken test ettiğiniz rengin parlaklığı göz önüne alındığında :
if (L + 0.05) / (0.0 + 0.05) > (1.0 + 0.05) / (L + 0.05) use #000000 else use #ffffff
Bu cebirsel olarak basitleştirir:
if L > sqrt(1.05 * 0.05) - 0.05
Veya yaklaşık olarak:
if L > 0.179 use #000000 else use #ffffff
Geriye kalan tek şey hesaplamak L
. Bu formül kılavuzlarda da verilmiştir ve sRGB'den lineer RGB'ye dönüşüm ve ardından parlaklık için ITU-R tavsiyesi BT.709'a benziyor .
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
W3C yönergelerine bağlı olduğu için 0.179 eşiği değiştirilmemelidir. Sonuçları beğeninize uygun bulmazsanız, yukarıdaki daha basit formülü deneyin.