2011-01-12 15 views
9

मेरे पास एक उपयोगकर्ता सेटअप है जहां वे अलर्ट के रंग चुन सकते हैं। अलर्ट एक पाठ या बटन पर पृष्ठभूमि रंग है। लेकिन समस्या यह है कि यदि वे एक गहरे नीले रंग का चयन करते हैं और हमारे पास काले अक्षरों के विपरीत पर्याप्त नहीं है और आप इसे पढ़ नहीं सकते हैं।विरोधी रंगों को उलट दें

मैंने रिवर्स विरोधी रंग पाने के लिए एक फ़ंक्शन बनाने की कोशिश की है लेकिन बहुत दूर हो गया है।

क्या ऐसा कोई कार्य है?

+1

इसके लिए यहां कम से कम दो प्रश्न हैं। एक http://stackoverflow.com/questions/596216/formula-to-determine-brightness-of-rgb-color है। मुझे पता है क्योंकि मैंने उनमें से एक से एक एल्गोरिदम लागू किया है और यह अच्छी तरह से काम करता है। – Nemi

उत्तर

0

आप प्रत्येक रंगीन चैनल (लाल, हरा और नीला) के बीच अंतर की गणना कर सकते हैं, और औसत अंतर प्राप्त कर सकते हैं - फिर उस पर आधारित कुछ तुलना करें।

1

क्या पाठ पृष्ठभूमि रंग से प्राप्त रंग होना चाहिए? क्या होगा यदि यह आर जी बी तीव्रता के आधार पर सफेद और काले रंग के बीच वैकल्पिक हो? विचार यह है कि सफेद हमेशा एक निश्चित तीव्रता के नीचे आर जी बी मानों पर दिखाई देगा और काला हमेशा बाकी पर दिखाई देगा।

मैं साझा करने के लिए एक काम एल्गोरिथ्म की जरूरत नहीं है, लेकिन आप की तर्ज पर कुछ की कोशिश कर सकते:

int threshold = 50; 
if(r < threshold && g < threshold && b < threshold) { 
    // set your font color to white 
} else { 
    // set your font color to black 
} 

आप शायद थोड़ा सीमा के साथ बेला के लिए कुछ अच्छी लग रही प्राप्त करने के लिए होगा। आप फ़ॉन्ट को थोड़ा सा टिंट भी कर सकते हैं जिस पर आर जी बी मान प्रभावी है।

13

उपयोग complementary color:

एल्गो सरल है, 255 से प्रत्येक रंग घटक घटाना नया रंग घटकों

Color textColor = Color.rgb(255-Color.red(bgColor), 
         255-Color.green(bgColor), 
         255-Color.blue(bgColor)); 

----- संपादित करें (के रूप में आरजीबी आधारित पूरक हमेशा काम नहीं कर सकते हैं पाने के लिए -

http://www.splitbrain.org/blog/2008-09/18-calculating_color_contrast_with_php

: ------

इन दो लिंक बहुत उपयोगी और विषय पर कर रहे हैं

http://24ways.org/2010/calculating-color-contrast

+5

जब उपयोगकर्ता 128/128/128 (या वास्तव में कुछ वास्तव में) रंग चुनता है तो यह कोई बड़ी समस्या नहीं देता है। – Anthony

+0

मैंने उत्तर में विकिपीडिया से एक लिंक शामिल किया है। आरजीबी आधारित पूरक समझने के लिए सबसे आसान है। एचएसवी आधारित पूरक इस मामले में काम करेगा। @Shynhriir: हाँ .. आरजीबी आधारित पूरक इस श्रेणी में काम नहीं करेगा, आप बिल्कुल सही हैं –

+0

आप एंड्रॉइड में विकी लिंक से पूरक रंग कैसे कोड करेंगे? –

2

मैं यह काम कर रहा है, मुझे लगता है कि :)

यहाँ समारोह है:

public static int OpposeColor(int ColorToInvert) 
{ 
    int RGBMAX = 255; 

    float[] hsv = new float[3]; 
    float H; 

    Log.i("HSV_H", "Start Color=" + ColorToInvert); 

    Color.RGBToHSV(Color.red(ColorToInvert), RGBMAX - Color.green(ColorToInvert), Color.blue(ColorToInvert), hsv); 

    Log.i("HSV_H", "Hue=" + hsv[0]); 
    Log.i("HSV_H", "Saturation=" + hsv[1]); 
    Log.i("HSV_H", "Value=" + hsv[2]); 

    H = (float) (hsv[0] + 0.5); 

    if (H > 1) H -= 1; 

    Log.i("HSV_H", "Hue2=" + H);   

    Log.i("HSV_H", "Color=" + Color.HSVToColor(hsv)); 

    return Color.HSVToColor(hsv); 


} 
+0

क्यों "आरजीबीएमएक्स -"? और रंग 0 और 360 के बीच एक मान है और 0 और 1 मुझे लगता है, मैं –

17

मैंने पाया कि मेरे लिए सबसे अच्छा समाधान YIQ मूल्यों में आरजीबी मूल्यों कन्वर्ट करने के लिए है कि । चूंकि हम केवल चमक मूल्य (वाई द्वारा प्रतिनिधित्व) में रूचि रखते हैं, वहां एक एकल गणना की जाती है: Y = (299*R + 587*G + 114*B)/1000। उस के लिए जावा कोड इस तरह दिखेगा:

public static Color getContrastColor(Color color) { 
    double y = (299 * color.getRed() + 587 * color.getGreen() + 114 * color.getBlue())/1000; 
    return y >= 128 ? Color.black : Color.white; 
} 

आप देख सकते हैं कि यह बस काला या सफेद उपयोग करने के लिए, मूल रंग की चमक के आधार पर फैसला किया। और परिणाम मेरी राय में बहुत अच्छा काम करता है। वजन (2 9, 587, 114) आंखों की संवेदनशीलता (या रेटिना की संवेदनशीलता) के समान अनुपात में आनुपातिक होते हैं।

+1

धन्यवाद के नीचे एक अद्यतन संस्करण पोस्ट करता हूं। इसमें सभी मामलों को शामिल नहीं किया जा सकता है, लेकिन मेरे उपयोग के लिए पेपर है (रंगीन पृष्ठभूमि पर पाठ को पढ़ने योग्य बनाएं) –

+0

आप हमेशा टेक्स्ट को बहुत अच्छी तरह पढ़ सकते हैं। नुकसान यह है कि पाठ काला या सफेद होगा, पृष्ठभूमि की रंगीन जानकारी "खो गई" है। – brimborium

6

मार्क्स समाधान के आधार पर मेरा सुझाव है:

public static int getComplementaryColor(int colorToInvert) { 
    float[] hsv = new float[3]; 
    Color.RGBToHSV(Color.red(colorToInvert), Color.green(colorToInvert), 
      Color.blue(colorToInvert), hsv); 
    hsv[0] = (hsv[0] + 180) % 360; 
    return Color.HSVToColor(hsv); 
} 

और अतिरिक्त मैं अब एक दिया रंग के लिए एक डिफ़ॉल्ट पृष्ठभूमि की गणना के लिए एक समान विधि बनाया,:

public static int getContrastVersionForColor(int color) { 
    float[] hsv = new float[3]; 
    Color.RGBToHSV(Color.red(color), Color.green(color), Color.blue(color), 
      hsv); 
    if (hsv[2] < 0.5) { 
     hsv[2] = 0.7f; 
    } else { 
     hsv[2] = 0.3f; 
    } 
    hsv[1] = hsv[1] * 0.2f; 
    return Color.HSVToColor(hsv); 
} 
+0

आपको 'पूरक पूरक रंग' पूरी तरह से काम कर रहा है लेकिन 'getContrastVersionForColor' नहीं, क्या आप ठीक कर सकते हैं? –

+0

आपका क्या मतलब है कि यह काम नहीं करता है? आपको परिणाम पसंद नहीं है? क्या आप एक रंग int मूल्य प्रदान कर सकते हैं जिसके लिए यह सही नहीं दिखता है? मैं इसे अक्सर इस्तेमाल करता हूं और कभी भी समस्या नहीं होती –

3

पूर्णांक समाधान:

public static int getContrastColor(int color) { 
     double y = (299 * Color.red(color) + 587 * Color.green(color) + 114 * Color.blue(color))/1000; 
     return y >= 128 ? Color.BLACK : Color.WHITE; 
    } 
+1

क्या आप कृपया समझ सकते हैं कि यह समस्या को कैसे हल करेगा? – Phani

+0

"मैंने रिवर्स विरोधी रंग प्राप्त करने के लिए एक फ़ंक्शन बनाने का प्रयास किया है लेकिन बहुत दूर हो गया है।" तो यहां एक फ़ंक्शन है ^^ यह काला या सफ़ेद रंग देता है। – Eboo

+0

पहले प्रश्न पर वापस जा रहे हैं..यदि यह समस्या का समाधान नहीं करता है .. फिर इसे हटाएं .. या फिर नवीनतम निष्कर्षों के साथ प्रश्न अपडेट करें। – Phani

संबंधित मुद्दे