2008-12-11 29 views
57

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

+31

_exact_ डुप्लिकेट नहीं है। एचएसएल! = एचएसवी। –

+0

एचएसवी समाधान में एचएसवी समाधान में उपयोग करने के लिए कोड को अनुकूलित करने के लिए क्या करना है? –

+7

विकिपीडिया: दोनों गणितीय बेलनाकार हैं, लेकिन एचएसवी को अवधारणाओं के रंगों के उलटा शंकु के रूप में माना जा सकता है, एचएसएल अवधारणात्मक रूप से एक डबल शंकु या क्षेत्र का प्रतिनिधित्व करता है। जबकि एचएसएल और एचएसवी में "ह्यू" एक ही विशेषता को संदर्भित करता है, "संतृप्ति" की उनकी परिभाषा नाटकीय रूप से भिन्न होती है। – BlaM

उत्तर

26

के माध्यम से पाया तो आप बस System.Drawing नाम स्थान का उपयोग कर विचार किया है? उदाहरण के लिए:।

System.Drawing.Color color = System.Drawing.Color.FromArgb(red, green, blue); 
float hue = color.GetHue(); 
float saturation = color.GetSaturation(); 
float lightness = color.GetBrightness(); 

ध्यान दें कि यह वास्तव में आप के लिए (differences between HSL and HSV देख सकते हैं और रंग वर्ग एक रूपांतरण एचएसएल/एचएसवी से वापस नहीं है लेकिन बाद यथोचित easy to add है क्या पूछा है नहीं है

+4

जैसा कि आप इंगित करते हैं, यह वास्तव में प्रश्न का उत्तर नहीं देता है क्योंकि ये विधियां एचएसएल रूपांतरण के लिए आरजीबी प्रदान करती हैं, आरजीबी से एचएसवी तक नहीं। – Greg

+3

@greg: मैं मानता हूं, इससे भयानक परिणाम आएंगे, जैसा कि मैंने स्वयं अनुभव किया है। – leppie

+11

-1: चूंकि यह प्रश्न का उत्तर नहीं है। एचएसवी एचएसएल से बहुत अलग है। * नोट *: एचएसवी को कभी-कभी एचएसबी (विशेष रूप से फ़ोटोशॉप में, और .NET में) के रूप में जाना जाता है। –

5

वहाँ एक सी कार्यान्वयन यहाँ है:

http://www.cs.rit.edu/~ncs/color/t_convert.html

बहुत सी # में बदलने के लिए सरल होना चाहिए, के रूप में लगभग कोई कार्यों कहा जाता है - बस गणना।

Google

+1

यह कार्यान्वयन सही नहीं है। ऐसा लगता है [इस उदाहरण कोड के आधार पर] (http://en.literateprograms.org/RGB_to_HSV_color_space_conversion_%28C%29) लेकिन इसमें एक सेक्शन (सामान्यीकरण भाग) गुम है। मुझे थोड़ी देर के लिए फिसल गया था! –

3

यह VB.net संस्करण है जो Blam की पोस्ट में सी कोड से मेरे लिए ठीक पोर्टेड काम करता है

वहाँ एक सी यहां कार्यान्वयन है:।

http://www.cs.rit.edu/~ncs/color/t_convert.html

सी # में कनवर्ट करने के लिए बहुत सरल होना चाहिए, क्योंकि लगभग कोई फ़ंक्शन नहीं कहा जाता है - बस> गणना।


Public Sub HSVtoRGB(ByRef r As Double, ByRef g As Double, ByRef b As Double, ByVal h As Double, ByVal s As Double, ByVal v As Double) 
    Dim i As Integer 
    Dim f, p, q, t As Double 

    If (s = 0) Then 
     ' achromatic (grey) 
     r = v 
     g = v 
     b = v 
     Exit Sub 
    End If 

    h /= 60 'sector 0 to 5 
    i = Math.Floor(h) 
    f = h - i 'factorial part of h 
    p = v * (1 - s) 
    q = v * (1 - s * f) 
    t = v * (1 - s * (1 - f)) 

    Select Case (i) 
     Case 0 
      r = v 
      g = t 
      b = p 
      Exit Select 
     Case 1 
      r = q 
      g = v 
      b = p 
      Exit Select 
     Case 2 
      r = p 
      g = v 
      b = t 
      Exit Select 
     Case 3 
      r = p 
      g = q 
      b = v 
      Exit Select 
     Case 4 
      r = t 
      g = p 
      b = v 
      Exit Select 
     Case Else 'case 5: 
      r = v 
      g = p 
      b = q 
      Exit Select 
    End Select 
End Sub 
93

ध्यान दें कि Color.GetSaturation() और Color.GetBrightness() वापसी एचएसएल मूल्यों, नहीं एचएसवी।
निम्नलिखित कोड अंतर दर्शाता है।

Color original = Color.FromArgb(50, 120, 200); 
// original = {Name=ff3278c8, ARGB=(255, 50, 120, 200)} 

double hue; 
double saturation; 
double value; 
ColorToHSV(original, out hue, out saturation, out value); 
// hue  = 212.0 
// saturation = 0.75 
// value  = 0.78431372549019607 

Color copy = ColorFromHSV(hue, saturation, value); 
// copy = {Name=ff3278c8, ARGB=(255, 50, 120, 200)} 

// Compare that to the HSL values that the .NET framework provides: 
original.GetHue();  // 212.0 
original.GetSaturation(); // 0.6 
original.GetBrightness(); // 0.490196079 

निम्नलिखित सी # कोड वह है जो आप चाहते हैं। यह Wikipedia पर वर्णित एल्गोरिदम का उपयोग करके आरजीबी और एचएसवी के बीच परिवर्तित हो जाता है। hue के लिए श्रेणियां 0 - 360 हैं, और saturation या value के लिए 0 - 1 हैं।

public static void ColorToHSV(Color color, out double hue, out double saturation, out double value) 
{ 
    int max = Math.Max(color.R, Math.Max(color.G, color.B)); 
    int min = Math.Min(color.R, Math.Min(color.G, color.B)); 

    hue = color.GetHue(); 
    saturation = (max == 0) ? 0 : 1d - (1d * min/max); 
    value = max/255d; 
} 

public static Color ColorFromHSV(double hue, double saturation, double value) 
{ 
    int hi = Convert.ToInt32(Math.Floor(hue/60)) % 6; 
    double f = hue/60 - Math.Floor(hue/60); 

    value = value * 255; 
    int v = Convert.ToInt32(value); 
    int p = Convert.ToInt32(value * (1 - saturation)); 
    int q = Convert.ToInt32(value * (1 - f * saturation)); 
    int t = Convert.ToInt32(value * (1 - (1 - f) * saturation)); 

    if (hi == 0) 
     return Color.FromArgb(255, v, t, p); 
    else if (hi == 1) 
     return Color.FromArgb(255, q, v, p); 
    else if (hi == 2) 
     return Color.FromArgb(255, p, v, t); 
    else if (hi == 3) 
     return Color.FromArgb(255, p, q, v); 
    else if (hi == 4) 
     return Color.FromArgb(255, t, p, v); 
    else 
     return Color.FromArgb(255, v, p, q); 
} 
+0

मुझे लगता है कि आपने अपने उत्तर में संतृप्ति और मूल्य के नमूना मानों को स्थानांतरित किया है। जब मैं आरजीबी (50,120,200) को ह्यू-संतृप्ति-मूल्य (एचएसवी) में परिवर्तित करता हूं तो मुझे एचएसवी (212, 75%, 78.4%) मिलता है। एचएसवी के लिए विकिपीडिया फॉर्मूला देख रहे हैं: वी = मैक्स (आर, जी, बी)। इस मामले में अधिकतम (50,120,200) = 200। 200/255 = 0.7843 –

+0

मैं बस उत्तर संपादित करूँगा, संतृप्ति और मूल्य संख्याओं को स्थानांतरित कर दूंगा। संतृप्ति 0.75 होना चाहिए, मान 0.7843 होना चाहिए ... –

+0

किसी भी विचार से संतृप्ति को 0-1 से संतृप्ति मूल्य में परिवर्तित करने के लिए कैसे करें जो एमएस पेंट का उपयोग करता है (यानी 0-240 स्केल)? –

4

EasyRGB में कई रंग स्थान रूपांतरण हैं। आरजीबी-> एचएसवी रूपांतरण के लिए Here is the code

1

सबसे पहले: सुनिश्चित करें कि आप इस तरह, एक बिटमैप के रूप में एक रंग है बनाने: (! ई मेरा रंग उठाया ईवेंट हैंडलर जो से है)

Bitmap bmp = (Bitmap)pictureBox1.Image.Clone(); 
paintcolor = bmp.GetPixel(e.X, e.Y); 

मैं क्या किया था जब मैं इस किया था एक समस्या पहले, मुझे पहले आरजीबीए (लाल, हरा, नीला और अल्फा) मान मिला। अगला मैंने 3 फ्लोट बनाए: फ्लोट ह्यू, फ्लोट संतृप्ति, फ्लोट चमक।तो फिर तुम बस कार्य करें:

hue = yourcolor.Gethue; 
saturation = yourcolor.GetSaturation; 
brightness = yourcolor.GetBrightness; 

बहुत इस तरह दिखता है:

Bitmap bmp = (Bitmap)pictureBox1.Image.Clone(); 
      paintcolor = bmp.GetPixel(e.X, e.Y); 
      float hue; 
      float saturation; 
      float brightness; 
      hue = paintcolor.GetHue(); 
      saturation = paintcolor.GetSaturation(); 
      brightness = paintcolor.GetBrightness(); 

अब आप उन्हें एक लेबल में प्रदर्शित करना चाहते हैं तो बस करते हैं:

yourlabelname.Text = hue.ToString; 
yourlabelname.Text = saturation.ToString; 
yourlabelname.Text = brightness.ToString; 

ये रहा , अब आपके पास एचएसवी मानों में आरजीबी वैल्यू हैं :)

आशा है कि इससे