Saya mencoba mengevaluasi kegelapan warna yang dipilih oleh pemilih warna untuk melihat apakah itu "terlalu hitam", dan jika demikian, setel ke putih. Saya pikir saya bisa menggunakan karakter pertama dari nilai hex untuk melakukan ini. Ini berfungsi, tetapi juga mengganti beberapa warna yang "terang".
Saya memiliki kode yang melakukan ini:
if (lightcolor.substring(0,3) == "#00"|| lightcolor.substring(0,3) == "#010"){
lightcolor="#FFFFFF";
color=lightcolor;
}
Harus ada cara yang lebih efisien dengan matematika hex untuk mengetahui bahwa warna telah melampaui tingkat kegelapan tertentu? Seperti jika lightcolor + "beberapa nilai hex" <= "beberapa nilai hex" lalu atur menjadi putih.
Saya menambahkan tinyColor, yang mungkin berguna untuk ini, tapi saya tidak tahu pasti.
javascript
colors
Dshiz
sumber
sumber
Jawaban:
Anda harus mengekstrak tiga komponen RGB satu per satu, dan kemudian menggunakan rumus standar untuk mengubah nilai RGB yang dihasilkan menjadi kecerahan yang dirasakan.
Dengan asumsi warna enam karakter:
EDIT
Sejak Mei 2014
tinycolor
sekarang memilikigetBrightness()
fungsi, meskipun menggunakan faktor pembobotan CCIR601, bukan yang ITU-R di atas.EDIT
Rentang nilai luma yang dihasilkan adalah 0..255, di mana 0 adalah yang paling gelap dan 255 adalah yang paling terang. Nilai yang lebih besar dari 128 dianggap ringan
tinycolor
. (disalin tanpa malu-malu dari komentar oleh @ pau.moreno dan @Alnitak)sumber
luma
Rentang nilai yang dihasilkan adalah0..255
, di mana0
paling gelap dan255
paling terang (ketiga koefisien berjumlah satu).isDark()
ambang batasnya di-hardcode pada 128The TinyColor perpustakaan (Anda sudah disebutkan itu) menyediakan beberapa fungsi untuk memeriksa dan memanipulasi warna, di antaranya:
getBrightness
isLight
gelap
getLuminance
sumber
Saya menemukan fungsi PHP Wordpress WooCommerce ini ( wc_hex_is_light ) dan saya mengubahnya ke JavaScript. Bekerja dengan baik!
sumber
Anda dapat menghitung luminansi :
Jadi, sangat bagus untuk memilih apakah teks harus putih atau hitam.
Metode di atas memungkinkan Anda untuk mengirimkan warna dalam format yang berbeda, tetapi algoritme pada dasarnya hanya masuk
luminance_get
.Saat saya menggunakannya, saya mengatur warna menjadi hitam jika luminansi lebih besar dari
180
, putih sebaliknya.sumber
Ada perbedaan penting di sini antara pencahayaan dan kecerahan. Luminance, pada akhirnya, adalah ukuran berapa banyak energi yang mengalir melalui area tertentu dan sepenuhnya mengabaikan bagaimana sistem persepsi kita memandang energi itu. Kecerahan, di sisi lain, adalah ukuran bagaimana kita merasakan energi itu dan memperhitungkan hubungan antara pencahayaan dan sistem persepsi kita. (Sebagai titik kebingungan, ada istilah yang disebut luminansi relatif, yang tampaknya digunakan secara sinonim dengan istilah kecerahan. Itu membuat saya tersandung).
Tepatnya, Anda mencari "kecerahan" atau "nilai" atau "luminansi relatif" seperti yang disarankan orang lain. Anda dapat menghitung ini dengan beberapa cara berbeda (seperti menjadi manusia!) Http://en.wikipedia.org/wiki/HSL_and_HSV#Lightness
sumber
Ini bekerja dengan hex misalnya #fefefe
Anda dapat mengubahnya untuk kembali
true
ataufalse
dengan mengubahuntuk
sumber
Solusi yang mungkin adalah mengubah warna Anda dari RGB ke HSB . HSB adalah singkatan dari hue, saturation, dan brightness (juga dikenal sebagai HSV, di mana V untuk nilai). Maka Anda hanya memiliki satu parameter untuk diperiksa: kecerahan.
sumber
Saya menyadari percakapan ini berumur beberapa tahun, tetapi masih relevan. Saya ingin menambahkan bahwa tim saya mengalami masalah yang sama di Java (SWT) dan menemukan ini sedikit lebih akurat:
sumber