2009-08-25 17 views
31

मैं पृष्ठभूमि रंग (हेक्स मान के रूप में) दिए गए काले या सफेद पाठ का उपयोग करना है या नहीं, यह निर्धारित करने के लिए एक विधि खोजने का प्रयास कर रहा हूं। क्या किसी ने इससे पहले निपटाया है? क्या ऐसा करने का कोई प्रभावी तरीका है?पृष्ठभूमि रंग, काला या सफेद पाठ को देखते हुए?

मेरे मामले में, मैं तर्क लागू करने के लिए (हालांकि अन्य भाषाओं में इस के साथ किसी भी अनुभव का स्वागत है) PHP का उपयोग किया जाएगा।

उत्तर

33

इस पेज पर एक नज़र डालें: Calculating Color Contrast with PHP

ध्यान रखें कि आप ऐसे मामलों में जहां उनमें से न तो विशेष रूप महान काम करता है करने के लिए बाध्य कर रहे हैं काले और सफेद अपने ही विकल्प हैं।

+11

+1 luminance गिना जा रहा है या रंग की चमक औसत से कहीं बेहतर है आरजीबी मूल्य। # एफएफ 0000 चमकदार लाल है, अंधेरा रंग नहीं है कि 85 का औसत आपको विश्वास करने के लिए प्रेरित करेगा। एचएसबी सिस्टम (बी के लिए 0-100% स्केल) में, आपको उज्ज्वल लाल के लिए बी = 100 मिलता है। लैब सिस्टम में, आप केवल 54% प्राप्त करते हैं, शायद यह अधिक उपयोगी है, क्योंकि यह 50% बिंदु से ऊपर है, यह दर्शाता है कि आपको इसके खिलाफ काले रंग का उपयोग करना चाहिए, न कि सफेद। –

+0

यह एक अच्छा खोज है! – Wilco

1

एक सरल लेकिन सही नहीं समाधान अलग-अलग घटकों (RGB) और बड़ा यह मान 'हल्के रंग' योग करने के लिए किया जाएगा। तो एक उच्च मूल्य के लिए आप काले रंग के अग्रभूमि के रूप में उपयोग कर सकते हैं, और कम मूल्य के लिए, सफेद का उपयोग करें।

फिर आप इस विधि में सुधार सकता है, ग्रेस्केल रंग के लिए विशिष्ट मामलों बनाने (आर = जी = बी) है, जो बहुत गहरे भूरे रंग के अलावा, सफेद पाठ अच्छी तरह से प्रदर्शित नहीं होगा।

संपादित करें: इसका मतलब है कि आपको अपने हेक्स मान में आरजीबी स्टोरेज के प्रारूप को जानने की आवश्यकता है, मानक 24 बीपीपी स्टोरेज 8 हेक्स अंकों के लिए 0x00RRGGBB है।

0

मैं आरजीबी घटकों के औसत मूल्य की गणना करता हूं और फिर तय करता हूं कि काले या सफेद का उपयोग करना है, उदा। सफेद ऊपर 0x66

2

यहाँ एक एल्गोरिथ्म है कि आपके पाठ की एक चमक इसके विपरीत अनुपात की गणना करने के लिए इस्तेमाल किया जा सकता है:

http://juicystudio.com/services/aertcolourcontrast.php

आप सफेद और काले रंग मूल्यों के साथ इस सूत्र का उपयोग गणना करने के लिए जो आप देता सकता है उच्च अनुपात, और इस प्रकार अधिक पठनीय पाठ।

2

आप the CSS Color library पर एक नज़र रखना चाहिए। यह PHP में लागू किया गया है और आपके लिए सभी कड़ी मेहनत करता है।

3
function getTextColour($hex){ 
    list($red, $green, $blue) = sscanf($hex, "#%02x%02x%02x"); 
    $luma = ($red + $green + $blue)/3; 

    if ($luma < 128){ 
     $textcolour = "white"; 
    }else{ 
     $textcolour = "black"; 
    } 
    return $textcolour; 
    } 
7

मुझे लगता है कि सबसे अच्छा तरीका है Luminosity Contrast एल्गोरिथ्म है:

की सलाह दें: अगले कार्यों काम करता है अच्छी तरह से समय की सबसे, लेकिन कभी कभी रंग हैं, जिसमें यह काम नहीं करता अच्छी तरह।

public function getContrastColor($hexColor) { 

     //////////// hexColor RGB 
     $R1 = hexdec(substr($hexColor, 0, 2)); 
     $G1 = hexdec(substr($hexColor, 2, 2)); 
     $B1 = hexdec(substr($hexColor, 4, 2)); 

     //////////// Black RGB 
     $blackColor = "#000000"; 
     $R2BlackColor = hexdec(substr($blackColor, 0, 2)); 
     $G2BlackColor = hexdec(substr($blackColor, 2, 2)); 
     $B2BlackColor = hexdec(substr($blackColor, 4, 2)); 

     //////////// Calc contrast ratio 
     $L1 = 0.2126 * pow($R1/255, 2.2) + 
       0.7152 * pow($G1/255, 2.2) + 
       0.0722 * pow($B1/255, 2.2); 

     $L2 = 0.2126 * pow($R2BlackColor/255, 2.2) + 
       0.7152 * pow($G2BlackColor/255, 2.2) + 
       0.0722 * pow($B2BlackColor/255, 2.2); 

     $contrastRatio = 0; 
     if ($L1 > $L2) { 
      $contrastRatio = (int)(($L1 + 0.05)/($L2 + 0.05)); 
     } else { 
      $contrastRatio = (int)(($L2 + 0.05)/($L1 + 0.05)); 
     } 

     //////////// If contrast is more than 5, return black color 
     if ($contrastRatio > 5) { 
      return 'black'; 
     } else { //////////// if not, return white color. 
      return 'white'; 
     } 
} 

कुछ परिणाम:

enter image description here

नोट:फ़ॉन्ट रंग पिछले समारोह से निर्धारित होता है। ब्रैकेट्स में संख्या विपरीत अनुपात है।



एक और simpliest और कम सटीक तरीका (YIQ में क्योंकि यह आरजीबी रंग अंतरिक्ष धर्मान्तरित) YIQ कहा जाता है:

public function getContrastColor($hexcolor) {    
    $r = hexdec(substr($hexcolor, 0, 2)); 
    $g = hexdec(substr($hexcolor, 2, 2)); 
    $b = hexdec(substr($hexcolor, 4, 2)); 
    $yiq = (($r * 299) + ($g * 587) + ($b * 114))/1000; 
    return ($yiq >= 128) ? 'black' : 'white'; 
}     
संबंधित मुद्दे