Saya mengalami masalah serupa. Saya harus menemukan metode yang baik untuk memilih warna font yang kontras untuk menampilkan label teks pada colorcales / heatmaps. Itu harus metode universal dan warna yang dihasilkan harus "tampan", yang berarti bahwa menghasilkan warna komplementer sederhana bukanlah solusi yang baik - kadang-kadang menghasilkan warna aneh, sangat intensif yang sulit untuk dilihat dan dibaca.
Setelah berjam-jam pengujian dan mencoba menyelesaikan masalah ini, saya menemukan bahwa solusi terbaik adalah memilih font putih untuk warna "gelap", dan font hitam untuk warna "cerah".
Berikut ini contoh fungsi yang saya gunakan di C #:
Color ContrastColor(Color color)
{
int d = 0;
// Counting the perceptive luminance - human eye favors green color...
double luminance = ( 0.299 * color.R + 0.587 * color.G + 0.114 * color.B)/255;
if (luminance > 0.5)
d = 0; // bright colors - black font
else
d = 255; // dark colors - white font
return Color.FromArgb(d, d, d);
}
Ini diuji untuk berbagai macam skala warna (pelangi, skala abu-abu, panas, es, dan banyak lainnya) dan merupakan satu-satunya metode "universal" yang saya temukan.
Sunting
Mengubah rumus penghitungan a
menjadi "luminansi perseptif" - benar-benar terlihat lebih baik! Sudah menerapkannya di perangkat lunak saya, terlihat hebat.
Sunting 2
@WebSeed memberikan contoh yang bagus untuk algoritma ini: http://codepen.io/WebSeed/full/pvgqEq/
Untuk berjaga-jaga seandainya seseorang menginginkan versi jawaban GaceK yang lebih pendek, mungkin lebih mudah dimengerti :
Catatan: Saya menghapus inversi dari nilai luma (untuk membuat warna-warna cerah memiliki nilai lebih tinggi, yang tampaknya lebih alami bagi saya dan juga merupakan metode perhitungan 'default'.
Saya menggunakan konstanta yang sama dengan GaceK dari sini karena mereka bekerja bagus untuk saya.
(Anda juga dapat menerapkan ini sebagai Metode Ekstensi menggunakan tanda tangan berikut:
Anda kemudian dapat memanggilnya via
foregroundColor = background.ContrastColor()
.)sumber
Terima kasih @Gacek . Ini versi untuk Android:
Dan versi yang lebih baik (lebih pendek):
sumber
1 - ...
bagian itu dan ganti namaa
menjadiluminance
Implementasi Swift saya atas jawaban Gacek:
sumber
Javascript [ES2015]
sumber
Terima kasih untuk posting ini.
Bagi siapa pun yang tertarik, berikut adalah contoh fungsi itu di Delphi:
sumber
Ini adalah jawaban yang sangat membantu. Terimakasih untuk ini!
Saya ingin membagikan versi SCSS:
Sekarang mencari tahu bagaimana menggunakan algoritma untuk secara otomatis membuat warna hover untuk tautan menu. Header cahaya mendapatkan hover yang lebih gelap, dan sebaliknya.
sumber
Implementasi flutter
sumber
Python Jelek jika Anda tidak ingin menulisnya :)
sumber
Saya memiliki masalah yang sama tetapi saya harus mengembangkannya di PHP . Saya menggunakan solusi @ Garek dan saya juga menggunakan jawaban ini: Konversi warna hex ke nilai RGB di PHP untuk mengkonversi kode warna HEX ke RGB.
Jadi saya membagikannya.
Saya ingin menggunakan fungsi ini dengan warna Background HEX yang diberikan, tetapi tidak selalu dimulai dari '#'.
sumber
Sebagai ekstensi Kotlin / Android:
sumber
Implementasi untuk tujuan-c
sumber
iOS Swift 3.0 (ekstensi UIColor):
sumber
Contoh Swift 4:
PEMBARUAN - Ditemukan bahwa
0.6
itu adalah test bed yang lebih baik untuk kuerisumber
CGColor.components
bervariasi tergantung pada ruang warna: misalnya,UIColor.white
ketika dilemparkan ke CGColor, hanya memiliki dua:[1.0, 1.0]
mewakili warna skala abu-abu (putih sepenuhnya) dengan alfa penuh. Cara yang lebih baik untuk mengekstraksi elemen RGB dari UIColor adalahUIColor.getRed(_ red:, green:, blue:, alpha:)
Perhatikan ada algoritma untuk ini di pustaka penutupan google yang mereferensikan rekomendasi w3c: http://www.w3.org/TR/AERT#color-contrast . Namun, dalam API ini Anda memberikan daftar warna yang disarankan sebagai titik awal.
sumber
Jika Anda memanipulasi ruang warna untuk efek visual, umumnya lebih mudah bekerja di HSL (Hue, Saturation, dan Lightness) daripada RGB. Memindahkan warna dalam RGB untuk memberikan efek yang menyenangkan secara alami cenderung sangat sulit secara konseptual, sedangkan mengubah menjadi HSL, memanipulasi di sana, kemudian mengonversi kembali keluar lebih intuitif dalam konsep dan selalu memberikan hasil yang terlihat lebih baik.
Wikipedia memiliki pengantar yang baik untuk HSL dan HSV yang terkait erat. Dan ada kode gratis di sekitar net untuk melakukan konversi (misalnya di sini adalah implementasi javascript )
Apa transformasi tepat yang Anda gunakan adalah masalah selera, tetapi secara pribadi saya akan berpikir membalik komponen Hue dan Lightness pasti akan menghasilkan warna kontras tinggi yang baik sebagai perkiraan pertama, tetapi Anda dapat dengan mudah menggunakan efek yang lebih halus.
sumber
Anda dapat memiliki teks rona pada latar belakang rona apa pun dan memastikan bahwa teks itu dapat dibaca. Saya selalu melakukannya. Ada rumus untuk ini dalam Javascript pada Teks yang Dapat Dibaca dalam Warna - STW * Seperti yang dikatakan pada tautan itu, rumus adalah variasi pada perhitungan penyesuaian invers-gamma, meskipun IMHO sedikit lebih mudah dikelola. Menu di sisi kanan tautan itu dan halaman terkait menggunakan warna yang dihasilkan secara acak untuk teks dan latar belakang, selalu dapat dibaca. Jadi ya, jelas itu bisa dilakukan, tidak masalah.
sumber
Variasi Android yang menangkap alfa juga.
(terima kasih @ thomas-vos)
sumber
base
Versi R dari jawaban @ Gacek untuk mendapatkanluminance
(Anda dapat menerapkan ambang Anda sendiri dengan mudah)Pemakaian:
sumber
Berdasarkan jawaban Gacek , dan setelah menganalisis contoh @ WebSeed dengan ekstensi browser WAVE , saya membuat versi berikut ini yang memilih teks hitam atau putih berdasarkan rasio kontras (seperti yang didefinisikan dalam Pedoman Aksesibilitas Konten Web (WCAG) W3C dalam Web Content Accessibility Guidelines (WCAG) 2.1 ) , bukannya pencahayaan.
Ini adalah kode (dalam javascript):
Contoh yang berfungsi dapat ditemukan di fork saya dari @ WebSeed's codepen, yang menghasilkan nol kesalahan kontras rendah di WAVE.
sumber