2010-02-11 19 views
31

कुछ आरजीबी घटकों के औसत मूल्य की गणना करने की तरह कुछ और फिर तय करें कि काला या सफेद का उपयोग करना है या नहीं?पृष्ठभूमि के आधार पर अग्रभूमि रंग काला या सफेद बनाएं

क्या मुझे आरजीबी को पहले चरण में एचएसवी में परिवर्तित करना है क्योंकि आरजीबी हमेशा मानव आंखों को नहीं देखता है?

मैं सी #

+2

इस प्रश्न में ऐसे उत्तर हैं जो आपकी सहायता करेंगे: http://stackoverflow.com/questions/946544/good-text-foreground-color-for-a-given-background-color/946570 –

+0

संबंधित (लेकिन स्वयं को डुप्लिकेट करता है) : http://stackoverflow.com/questions/3116260/given-a-background-color-how-to-get-a-foreground-color-that-make-it-readable-on http://stackoverflow.com/ प्रश्न/3942878/कैसे-से-तय-फ़ॉन्ट-रंग-इन-व्हाइट-या-ब्लैक-ऑन-बैकग्राउंड-कलर – JYelton

उत्तर

3

इसके बारे में क्या?

private static Color GetReadableForeColor(Color c) 
{ 
    return (((c.R + c.B + c.G)/3) > 128) ? Color.Black : Color.White; 
} 
+1

निम्न मानों का उपयोग करके इसे आज़माएं: 128, 255, 0. यह एक हल्का हरा है जो काले रंग की पृष्ठभूमि के खिलाफ पढ़ने में आसान है। हालांकि, औसत मूल्य 127 है, जिसके लिए आपकी विधि सफेद लौट जाएगी। – JYelton

0

उपयोग कर रहा हूँ आप रंग गहराई के आधार पर एक साधारण गणना कर सकता है, अगर कहते हैं कि तुम एक #FFFFFF रंग प्रारूप था, तो आप सिर्फ आरजीबी मान जोड़ने और गणना करता है, तो वे आधे रास्ते नीचे होते हैं तो हो सकता है ।

(एफ x एफ = 256) उस मामले में अधिकतम 255 है प्रति, तो बस की जाँच करता है, तो यह है कि सीमा के अंतर्गत है: रंग नीचे है

var colorCode = ((R + B + G) < 255*3) ? "#FFFFFF" : "#000000"; 

है, यह गहरे रंग की है ... एक सफेद पृष्ठभूमि का उपयोग । यदि यह ऊपर है, तो यह हल्का है ... एक काला पृष्ठभूमि का उपयोग करें। यह सही नहीं है, लेकिन शुरू करने का विचार है।

+0

मैंने मूल रूप से अपनी परियोजना में ऐसा कुछ करने की कोशिश की, और इसके परिणामस्वरूप कुछ मौकों पर सफेद/काले लेबल उनके पृष्ठभूमि रंगों के खिलाफ ध्यान देने योग्य नहीं थे। – JYelton

59

ऐसा ही होता है मुझे बहुत पहले एक परियोजना के लिए इस फ़ंक्शन की आवश्यकता नहीं थी।

private int PerceivedBrightness(Color c) 
{ 
    return (int)Math.Sqrt(
    c.R * c.R * .241 + 
    c.G * c.G * .691 + 
    c.B * c.B * .068); 
} 

इस सूत्र मैं Nbd Tech पर वेब कि कथित रंग और रंग रूपांतरण फार्मूला के साथ निपटा पर पाया। साइट बहुत सारी जानकारी देती है जो सहायक है।

यह इस तरह का उपयोग करने का चयन करने के है काला या सफेद:

var foreColor = (PerceivedBrightness(backColor) > 130 ? Color.Black : Color.White); 

आप 130 कटऑफ के रूप में के अलावा किसी अन्य मान का उपयोग कर सकते हैं; यह वरीयता है।


अद्यतन: Darel रेक्स फिनले के अनुसार his site पर:

मूल्यों मैं वास्तव में 0.241, 0.691, 0.068 और फ़ोटोशॉप के साथ खेल रहे थे द्वारा के साथ आया था, लेकिन मेरे पास है चूंकि सूचित किया गया है कि मान .29 9, .587, और .114 अधिक सटीक हैं।

यह विनिर्देश ITU-R Recommendation BT.601 (या संक्षिप्त के लिए रिक 601) का पालन करता है। जिस साइट पर मैंने ऊपर बताया है, Nbd Tech, अभी तक इसे प्रदर्शित करने के लिए अपडेट नहीं किया गया है।

इस के आधार पर, यहाँ अद्यतन विधि है (टिप्पणी के लिए डीटीआई-मैट लिए धन्यवाद):

private int PerceivedBrightness(Color c) 
{ 
    return (int)Math.Sqrt(
    c.R * c.R * .299 + 
    c.G * c.G * .587 + 
    c.B * c.B * .114); 
} 

सीमा पसंद पर ध्यान दें: के पास एक कथित चमक के साथ

रंग बीच (उदाहरण के लिए 120-140) अधिक व्यक्तिपरक होगा। उदाहरण के लिए, यह बहस योग्य है कि लाल (एफएफ 0000), जो 13 9 का मूल्यांकन करता है, एक काला या सफेद ओवरले के साथ स्पष्ट है।

White and Black on Red

+0

यह मूल रूप से लुमा के लिए सूत्र है, आउटलेटर्स को अधिक वजन देने के लिए मूल्यों को कम करना। परिणाम 0-255 स्केल है। http://en.wikipedia.org/wiki/Luma_%28video%29 –

+2

** नोट: ** इन मानों के लिए स्रोत अपडेट किया गया है: http://alienryderflex.com/hsp.html अब वे दिखाए गए हैं जैसा: 'आर: .29 9'' जी: .587' 'बी: .114' –

+0

@ डीटीआई टिप के लिए धन्यवाद, मैंने जवाब अपडेट किया है। – JYelton

-1

मैं सही ढंग से समझ रहा हूँ, तो एक दृष्टिकोण, डेस्कटॉप वॉलपेपर छवि के काबू पाने कुछ मनोर यह है क्या रंग में जाँच करें और फिर अपने आवेदन के आधार पर रंग बदलने के लिए हो सकता है।

एक लेख on geekpedia (उस पर गूगल पर और हिट के बहुत सारे) वर्तमान डेस्कटॉप वॉलपेपर को पकड़ करने के बारे में नहीं है, लेकिन मूल आधार वर्तमान वॉलपेपर के रजिस्ट्री मान हड़पने के लिए है:

RegistryKey rkWallPaper = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", false); 
string WallpaperPath = rkWallPaper.GetValue("WallPaper").ToString(); 

आप तब छवि को खोलने के लिए उस पथ का उपयोग कर सकते हैं। फिर आप आरजीबी में आयामों और व्यक्तिगत पिक्सेल रंगों जैसे कई गुणों को पकड़ सकते हैं।

यह काम करने के लिए कि क्या यह "अधिक सफेद" या "अधिक काला" है, आपके पास कई विकल्प हैं।

एक विचार आरजीबी में प्रत्येक पिक्सेल रंग प्राप्त करने के लिए होगा, मूल्यों का औसत (ग्रेस्केल मान प्राप्त करने के लिए) और फिर छवि में प्रत्येक पिक्सेल के ग्रेस्केल मान को औसत करें। यदि यह आता है> 128 तो यह "सफेद" माना जा सकता है। यदि < 128 फिर "काला"। असल में आप निर्णय ले रहे हैं कि मध्य-ग्रे विभाजित रेखा के किनारे छवियों की पिक्सेल तीव्रताएं औसत हैं।

// Psudo code - can't check the C# spec atm. 
foreach(Pixel p in image) 
{ 
    // get average of colour components. 
    double greyScale = (p.Red + p.Green + p.Blue)/3; 
    totalIntensity += greyScale; 
} 

double averageImageIntensity = totalIntensity/image.NumPixels; 

if(totalIntensity > 128) // image could be considered to be "white" 
else // image could be considered "black". 

समस्याएं: समय बचाने के लिए एक धीमी गति से प्रक्रिया हो सकता है, आप केवल पिक्सल के कुछ नमूने के लिए चाहते हो सकता है (हर 10 वीं एक आदि कहते हैं,)। आमतौर पर, ऐसा लगता है कि यह काफी हद तक काम कर रहा है। रन-टाइम पर उपयोगकर्ता फ़ाइलों को खींचना और उनके साथ गड़बड़ करना मुश्किल से साफ है, और यह संभावित सुरक्षा और स्थिरता चिंताओं को प्रदान करता है। क्या होगा यदि छवि डफ या भ्रष्ट आदि है

व्यक्तिगत रूप से मैं सुझाव देता हूं कि उपयोगकर्ता को केवल रंग/थीम/त्वचा का विकल्प दें, या बेहतर है कि उन्हें इसे अनुकूलित करने दें!

+0

मैं पूरे ऐप रंग को बदलना नहीं चाहता हूं। मैं एक सूचीदृश्य का उपयोग कर रहा हूं जिसमें वस्तुओं में बीजी रंग है और प्रत्येक आइटम का पाठ पठनीय होना चाहिए ... – Kai

3

Color struct देशी रूप HSB करने के लिए रूपांतरण का समर्थन करता है।

if (Color.GetBrightness() > 0.5f) { 
    // win 
} 

आप संतृप्ति का एक घटक भी जोड़ना चाह सकते हैं, क्योंकि संतृप्ति भी स्पष्ट 'हल्कापन' में योगदान देती है।

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