इसी तरह के सवाल के मेरे जवाब पर निर्माण ।
आपको अलग-अलग लाल, हरे और नीले रंग की तीव्रता पाने के लिए हेक्स कोड को 3 टुकड़ों में तोड़ना होगा। कोड के प्रत्येक 2 अंक हेक्साडेसिमल (बेस -16) अंकन में एक मूल्य का प्रतिनिधित्व करते हैं। मैं यहाँ रूपांतरण के विवरण में नहीं जाऊँगा, उन्हें देखना आसान है।
एक बार जब आपके पास व्यक्तिगत रंगों के लिए तीव्रता होती है, तो आप रंग की समग्र तीव्रता निर्धारित कर सकते हैं और संबंधित पाठ चुन सकते हैं।
if (red*0.299 + green*0.587 + blue*0.114) > 186 use #000000 else use #ffffff
186 की दहलीज सिद्धांत पर आधारित है, लेकिन स्वाद के लिए समायोजित किया जा सकता है। 150 की सीमा के नीचे की टिप्पणियों के आधार पर आपके लिए बेहतर काम हो सकता है।
संपादित करें: ऊपर सरल है और यथोचित रूप से अच्छी तरह से काम करता है, और लगता है कि StackOverflow में यहाँ अच्छी स्वीकृति है। हालांकि, नीचे दी गई टिप्पणियों में से एक यह दिखाता है कि कुछ परिस्थितियों में डब्ल्यू 3 सी दिशानिर्देशों का अनुपालन नहीं हो सकता है। इसके साथ मैं एक संशोधित रूप प्राप्त करता हूं जो हमेशा दिशानिर्देशों के आधार पर उच्चतम विपरीत चुनता है। यदि आपको W3C नियमों के अनुरूप होने की आवश्यकता
नहीं है, तो मैं ऊपर दिए गए सरल सूत्र के साथ रहना चाहूँगा।
W3C अनुशंसाओं में विपरीत के लिए दिया गया सूत्र है (L1 + 0.05) / (L2 + 0.05)
, जहां L1
सबसे हल्के रंग L2
का प्रकाश है और 0.0-1.0 के पैमाने पर सबसे अंधेरे का प्रकाश है। काले रंग की चमक 0.0 है और सफेद 1.0 है, इसलिए उन मूल्यों को प्रतिस्थापित करने से आप उच्चतम विपरीत के साथ एक का निर्धारण कर सकते हैं। यदि काले रंग के विपरीत सफेद के लिए विपरीत से अधिक है, तो काले रंग का उपयोग करें, अन्यथा सफेद रंग का उपयोग करें। रंग की चमक को देखते हुए आप परीक्षण के रूप L
में परीक्षण कर रहे हैं :
if (L + 0.05) / (0.0 + 0.05) > (1.0 + 0.05) / (L + 0.05) use #000000 else use #ffffff
यह बीजगणित को सरल बनाता है:
if L > sqrt(1.05 * 0.05) - 0.05
या लगभग:
if L > 0.179 use #000000 else use #ffffff
केवल एक ही चीज की गणना करना है L
। वह सूत्र भी दिशा - निर्देशों में दिया गया है और यह लग रहा है कि sRGB से रैखिक RGB में रूपांतरण के बाद ITU-R सिफारिश BT.709 के लिए luminance है।
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
0.179 की सीमा को तब से नहीं बदला जाना चाहिए क्योंकि यह डब्ल्यू 3 सी दिशानिर्देशों से बंधा है। यदि आप अपनी पसंद के अनुसार परिणाम नहीं पाते हैं, तो ऊपर दिए गए सरल सूत्र का प्रयास करें।