2011-10-21 22 views
6

मैं तर्क रंग के साथ एक विधि को कॉल करना चाहता हूं। लेकिन बहुत सारे रंग हैं जो केवल छाया से भिन्न होते हैं। मैं अपने रंग से केवल अलग-अलग रंगों को कैसे ढूंढ सकता हूं, उदाहरण के लिए एंटीक व्हाइट और बिस्क। Here's कलर पैलेट।सी # समान रंग ढूंढना

Bitmap LogoImg = new Bitmap("file1.jpeg");//the extension can be some other 
System.Drawing.Color x = LogoImg.GetPixel(LogoImg.Width-1, LogoImg.Height-1); 
LogoImg.MakeTransparent(x); 
image1.Source = GetBitmapSource(LogoImg); 
+0

आर, जी की एक अधिकतम परिवर्तन या बी के एक treshold का उपयोग करें (या सभी तीन) – RvdK

+0

क्या आप अपने परिणामों के साथ क्या करना चाहते हैं? – alexn

+0

संभावित डुप्लिकेट [प्रोग्रामिंग के समान रंग ढूंढना] (http://stackoverflow.com/questions/1725505/finding-similar-colors-programatically) –

उत्तर

6

मैं इस दिनचर्या here पाया:

Color nearest_color = Color.Empty; 
foreach (object o in WebColors) 
{ 
    // compute the Euclidean distance between the two colors 
    // note, that the alpha-component is not used in this example 
    dbl_test_red = Math.Pow(Convert.ToDouble(((Color)o).R) - dbl_input_red, 2.0); 
    dbl_test_green = Math.Pow(Convert.ToDouble 
     (((Color)o).G) - dbl_input_green, 2.0); 
    dbl_test_blue = Math.Pow(Convert.ToDouble 
     (((Color)o).B) - dbl_input_blue, 2.0); 

    temp = Math.Sqrt(dbl_test_blue + dbl_test_green + dbl_test_red); 
    // explore the result and store the nearest color 
    if(temp == 0.0) 
    { 
     nearest_color = (Color)o; 
     break; 
    } 
    else if (temp < distance) 
    { 
     distance = temp; 
     nearest_color = (Color)o; 
    } 
} 
+0

वेबकॉलर्स क्या है? –

+0

यह एक रंग पैलेट है। एक नज़र डालें [यहां] (http://pietschsoft.com/post/2006/06/29/C-NET-Convert- सिस्टम सिस्टम क्रॉलर-to-HTML-color.aspx) इसे कुछ अलग करने के लिए – Marco

+0

कोई वास्तविक कारण नहीं है हालांकि, वर्ग रूट लेने के लिए। निकटतम मूल्य निकटतम मूल्य होगा, यहां तक ​​कि उस CPU-भारी ऑपरेशन को जोड़ने के बिना भी। – Nyerguds

11

आप इस तरह एक विधि का उपयोग किया जा सका:

public bool AreColorsSimilar(Color c1, Color c2, int tolerance) 
{ 
    return Math.Abs(c1.R - c2.R) < tolerance && 
      Math.Abs(c1.G - c2.G) < tolerance && 
      Math.Abs(c1.B - c2.B) < tolerance; 
} 

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

+3

कुछ और विचार करने के लिए, एक ही काम कर रहा है, लेकिन एचएसवी रंग अंतरिक्ष में। –

2

इस उदाहरण Find the Nearest Color with C# का विश्लेषण करें। आशा आपको एक विचार देता है।

enter image description here

Color nearest_color = Color.Empty; 
foreach (object o in WebColors) 
{ 
    // compute the Euclidean distance between the two colors 
    // note, that the alpha-component is not used in this example 
    dbl_test_red = Math.Pow(Convert.ToDouble(((Color)o).R) - dbl_input_red, 2.0); 
    dbl_test_green = Math.Pow(Convert.ToDouble 
     (((Color)o).G) - dbl_input_green, 2.0); 
    dbl_test_blue = Math.Pow(Convert.ToDouble 
     (((Color)o).B) - dbl_input_blue, 2.0); 
    // it is not necessary to compute the square root 
    // it should be sufficient to use: 
    // temp = dbl_test_blue + dbl_test_green + dbl_test_red; 
    // if you plan to do so, the distance should be initialized by 250000.0 
    temp = Math.Sqrt(dbl_test_blue + dbl_test_green + dbl_test_red); 
    // explore the result and store the nearest color 
    if(temp == 0.0) 
    { 
     // the lowest possible distance is - of course - zero 
     // so I can break the loop (thanks to Willie Deutschmann) 
     // here I could return the input_color itself 
     // but in this example I am using a list with named colors 
     // and I want to return the Name-property too 
     nearest_color = (Color)o; 
     break; 
    } 
    else if (temp < distance) 
    { 
     distance = temp; 
     nearest_color = (Color)o; 
    } 
} 
+0

आपने अभी एक ही साइट से ली गई एक ही दिनचर्या पोस्ट की है :) – Marco

+0

वेबकॉलर्स क्या है? –

+0

जैसा कि आप टाइमस्टैम्प टूलटिप में देख सकते हैं, दोनों उत्तरों को करीबी बार बनाया जाता है। –

0

मैं समान रंग पाते हैं कि आप आरजीबी एक के बजाय HSL or HSB color space पर एक नज़र रखना चाहिए, इस के साथ कारण यह एक बहुत समान रंग लगाने के लिए आसान है करने के लिए लगता है।

नेट के भीतर आप GetHue(), GetSaturation() और GetBrightness() विधि को इन मानों को किसी दिए गए रंग से प्राप्त करने के लिए कॉल कर सकते हैं और इन मानों की तुलना समान रूप से ढूंढने के लिए कर सकते हैं।

यदि आपको किसी एचएसबी मान से रंग में वापस जाने की आवश्यकता है तो आप this method का भी उपयोग कर सकते हैं।

3

आप KnownColors enum से निकटतम रंग प्राप्त कर सकते हैं।

// A color very close to Rosy Brown 
var color = Color.FromArgb(188, 143, 142); 

var colors = Enum.GetValues(typeof (KnownColor)) 
       .Cast<KnownColor>() 
       .Select(Color.FromKnownColor); 

var closest = colors.Aggregate(Color.Black, 
       (accu, curr) => 
       ColorDiff(color, curr) < ColorDiff(color, accu) ? curr : accu); 

और समर्थन विधि

private int ColorDiff(Color color, Color curr) 
{ 
    return Math.Abs(color.R - curr.R) + Math.Abs(color.G - curr.G) + Math.Abs(color.B - curr.B); 
} 
+0

महान समाधान! क्या आप इसे सार्वभौमिक विंडोज ऐप्स प्रोग्रामिंग करते समय Windows.UI.Color और Windows.UI.Colors का उपयोग करने के लिए अपडेट कर सकते हैं? धन्यवाद। – AnAurelian

1

मैं नीचे Keven Holditch के जवाब का इस्तेमाल किया। लेकिन मैंने इसे अपने उद्देश्यों के लिए संशोधित किया। यह संस्करण अनन्य-या इतना उपयोग करता है कि सहिष्णुता से केवल एक ही मूल्य बंद हो सकता है और फिर भी सत्य वापस आ सकता है। (सहिष्णुता भी < = बजाय सिर्फ < है।)

private bool AreColorsSimilar(Color c1, Color c2, int tolerance) 
{ 
    return Math.Abs(c1.R - c2.R) <= tolerance^
      Math.Abs(c1.G - c2.G) <= tolerance^
      Math.Abs(c1.B - c2.B) <= tolerance; 
} 
संबंधित मुद्दे