2008-12-13 15 views
8

जैसे स्ट्रिंग में बदलने की कोशिश कर रहा है मेरी सभी विधियां मुझे विभिन्न तरीकों से विफल कर रही हैं। विभिन्न प्रकाश व्यवस्था यह सब भी गड़बड़ कर सकते हैं।एक .net रंग से आरजीबी को "लाल" या "नीला"

क्या कोई भी आरजीबी मूल्य दिए गए नाम को वापस करने का प्रयास कर रहा है? "लाल" "हरा" "नीला" आज के लिए मेरी जरूरतों को पूरा करने के लिए पर्याप्त होगा।

मेरे पास मेरे वेब कैम से छवियों की असुरक्षित बाइट प्रोसेसिंग है।

webcam http://i35.tinypic.com/2yvorau.png

colors

+0

तो किसी दिए गए रंग के निकटतम रंग का नाम ढूंढने के लिए रंग और नामों के शब्दकोश के रूप में समस्या को बहाल किया जा सकता है? – ICR

उत्तर

0

खैर, लाल/ग्रीन/ब्लू निरीक्षण द्वारा पहचान करने के लिए काफी आसान कर रहे हैं; आपको समर्थन करने के लिए कितने मूल्यों की आवश्यकता है?

समस्या यह है कि जब तक आप नामित रंग से शुरू नहीं करते हैं, तो वापस को एक से प्राप्त करना बहुत मुश्किल है; IsNamedColor झूठी वापसी करेगा भले ही आप FromArgb के माध्यम से एक स्पष्ट रंग बनाते हैं।

यदि आपको केवल वास्तविक अपेक्षित मानक रंगों की आवश्यकता है, तो आप ज्ञात रंगों को प्रतिबिंब के माध्यम से गणना कर सकते हैं?

 Color test = Color.FromArgb(255,0,0); 
     Color known = (
        from prop in typeof(Color) 
         .GetProperties(BindingFlags.Public | BindingFlags.Static) 
        where prop.PropertyType == typeof(Color) 
        let color = (Color)prop.GetValue(null, null) 
        where color.A == test.A && color.R == test.R 
        && color.G == test.G && color.B == test.B 
        select color) 
        .FirstOrDefault(); 

     Console.WriteLine(known.Name); 

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

+0

पूर्ण स्पेक्ट्रम मेरे पास मेरे वेब कैम से बाइट छवि प्रसंस्करण है। http://i35.tinypic.com/2yvorau.png –

+3

मानक रंगों का थोड़ा सा सरल स्रोत ज्ञात रंगों enum है। इस तरह आपको GetProperties आदि का उपयोग करने की आवश्यकता नहीं है (रंग का उपयोग करें। FromKnownColor।) –

4

आप नाम के साथ जाना जाता है रंग की एक सूची है, तो आप देख सकते हैं जो उन लोगों के नाम से जाना जाता रंग की दी गई लक्ष्य रंग के सबसे करीबी 'के लिए है, (एफ # कोड) की तर्ज पर एक' निकटता 'समारोह का उपयोग कर:

let Diff (c1:Color) (c2:Color) = 
    let dr = (c1.R - c2.R) |> int 
    let dg = (c1.G - c2.G) |> int 
    let db = (c1.B - c2.B) |> int 
    dr*dr + dg*dg + db*db 

जो भी ज्ञात रंगों में से एक है, उस लक्ष्य रंग के लिए सबसे छोटा अंतर है जिसे आप नाम देना चाहते हैं, उस नाम का उपयोग करें।

+0

ओह यह बहुत अच्छा है – xxxxxxx

+0

अल्टो कोड का एक सुंदर टुकड़ा। यह समाधान आपको अधिकतम देता है। आरजीबीएस अंतर का। वास्तव में मैं क्या पूछ रहा हूँ। मैं एक रंग देना चाहता हूं और करीब मिलना चाहता हूं। लेकिन यह लिखकर मैंने इसे अपने सिर में जवाब दिया। मैं बाद में कोड पोस्ट करूंगा –

2

मुझे आरजीबी मूल्यों की तुलना में hue/saturation/brightness के संदर्भ में रंगों के बारे में सोचने के लिए व्यक्तिगत रूप से अधिक प्राकृतिक लगता है, और मुझे लगता है कि इस मामले में आपके लिए अच्छा काम करेगा। इसे आज़माएं:

स्पेक्ट्रम की कुछ श्रेणियों में रंगीन नामों को असाइन करें, जैसा कि आप फिट देखते हैं। उदाहरण के लिए, शायद लाल 0-39 है, नारंगी 40-79 है, आदि (वे मनमानी संख्याएं हैं - मुझे नहीं पता कि वे किसी भी प्रकार के पैमाने पर फिट हैं या नहीं)। फिर अपने आरजीबी मूल्य से रंग की गणना करें (आप एक फॉर्मूला here पा सकते हैं, हालांकि अन्य हो सकते हैं)। एक बार जब आप रंग को जानते हैं, तो आप जानते हैं कि स्पेक्ट्रम की किस श्रेणी में है, और आप इसे एक नाम दे सकते हैं।

+0

यह एकमात्र अच्छा जवाब है! रंग खोजने के लिए, एचएसवी और एचएसएल कलर स्पेस एकमात्र अच्छा विकल्प है। ओपनसीवी में आपका कोड 5 लाइनों की तरह ले सकता है! –

3

आप इस कोड की कोशिश कर सकते

static char[] hexDigits = { 
     '0', '1', '2', '3', '4', '5', '6', '7', 
     '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; 



public static string ColorToHexString(Color color) 
     { 
      byte[] bytes = new byte[4]; 
      bytes[0] = color.A; 
      bytes[1] = color.R; 
      bytes[2] = color.G; 
      bytes[3] = color.B; 
      char[] chars = new char[bytes.Length * 2]; 
      for (int i = 0; i < bytes.Length; i++) 
      { 
       int b = bytes[i]; 
       chars[i * 2] = hexDigits[b >> 4]; 
       chars[i * 2 + 1] = hexDigits[b & 0xF]; 
      } 
      return new string(chars); 
     } 
0

यहाँ एक सरल नाम दो क्वालिफायर और एक रंग नाम का उपयोग योजना है:

string ColorName(Color c) 
{ 
    List<float> hues = new List<float>() 
    { 0, 15, 35, 44, 54, 63, 80, 160, 180, 200, 244, 280, 350, 360}; 
    List<string> hueNames = new List<string>() 
     { "red", "orange-red", "orange", "yellow-orange", "yellow", 
      "yellow-green", "green" , "blue-green" , "cyan", "blue", 
      "violet", "purple", "red" }; 

    float h = c.GetHue(); 
    float s = c.GetSaturation(); 
    float b = (c.R * 0.299f + c.G * 0.587f + c.B *0.114f)/256f; 

    string name = s < 0.35f ? "pale " : s > 0.8f ? "vivid " : ""; 
    name += b < 0.35f ? "dark " : b > 0.8f ? "light " : ""; 
    for (int i = 0; i < hues.Count - 1; i++) 
     if (h >= hues[i] && h <= hues[i+1]) 
     { 
      name += hueNames[i]; 
      break; 
     } 
    return name; 
} 

आप आसानी से यह अनुकूलित कर सकते हैं यदि आप और अधिक होने की उदास चाहते विभेदित आदि ..

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