2008-12-11 12 views
57

Wie wird die RGB-Farbe in HSV geändert? In C# Sprache. Ich suche nach sehr schneller Methode ohne irgendeine externe Bibliothek.Wie ändere ich die RGB-Farbe in HSV?

+31

Kein _exact_ Duplikat. HSL! = HSV. –

+0

Was ist zu tun, um Code aus HSL-Post in HSV-Lösung zu verwenden? –

+7

Wikipedia: Beide sind mathematisch zylindrisch, aber HSV kann konzeptionell als ein invertierter Kegel von Farben gedacht werden, HSL stellt konzeptionell einen Doppelkegel oder eine Kugel dar. Während "Farbton" in HSL und HSV sich auf das gleiche Attribut bezieht, unterscheiden sich ihre Definitionen von "Sättigung" dramatisch. – BlaM

Antwort

26

Haben Sie Namespace betrachtet einfach mit System.Drawing gefunden? Zum Beispiel:.

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

Beachten Sie, dass es nicht genau das, was Sie für (siehe differences between HSL and HSV und die Color-Klasse nicht über eine Umwandlung zurück von HSL/HSV aber letztere ist recht easy to add

+4

Wie Sie darauf hinweisen, beantwortet dies die Frage nicht wirklich, da diese Methoden eine Konvertierung von RGB zu HSL bereitstellen, nicht RGB zu HSV. – Greg

+3

@greg: Ich stimme zu, das wird zu schrecklichen Ergebnissen führen, wie ich selbst erlebt habe. – leppie

+11

-1: Da dies nicht die Antwort auf die Frage ist. HSV unterscheidet sich sehr von HSL. * Hinweis *: HSV wird manchmal als HSB bezeichnet (besonders in Photoshop und in .NET) –

5

Es gibt eine C-Implementierung hier:

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

sollen sehr einfach sein zu C# zu konvertieren, da so gut wie keine Funktionen aufgerufen werden - nur Berechnungen.

über Google

+1

Diese Implementierung ist nicht korrekt. Es scheint [basierend auf diesem Beispielcode] (http://en.literateprograms.org/RGB_to_HSV_color_space_conversion_%28C%29) zu sein, aber es fehlt ein Abschnitt (der Normalisierungsteil). Hatte mich für eine Weile stolpern lassen! –

3

gefragt haben diese ist die VB.net-Version, die für mich portiert von der C-Code in BlaM der Post

Es gibt eine C-Implementierung hier gut arbeitet.

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

Sollte sehr einfach in C# konvertiert werden, da fast keine Funktionen aufgerufen werden - nur> Berechnungen.


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

Beachten Sie, dass Color.GetSaturation() und Color.GetBrightness() Rückkehr HSL-Werte, nicht HSV.
Der folgende Code demonstriert den Unterschied.

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 

Der folgende C# -Code ist, was Sie wollen. Es konvertiert zwischen RGB und HSV unter Verwendung der Algorithmen, die auf Wikipedia beschrieben sind. Die Bereiche sind 0 - 360 für hue und 0 - 1 für saturation oder value.

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

ich denke, dass Sie die Beispielwerte von Sättigung und Wert in Ihrer Antwort transponiert haben. Wenn ich rgb (50,120,200) in Farbton-Sättigungs-Wert (HSV) umwandele, bekomme ich HSV (212, 75%, 78,4%). Wikipedia-Formeln für HSV betrachten: V = Max (r, g, b). In diesem Fall ist max (50,120,200) = 200. 200/255 = 0.7843 –

+0

Ich bearbeite nur die Antwort, indem ich die Sättigung und die Wertzahl umsetze. Sättigung sollte 0,75 sein, Wert sollte 0,7843 sein ... –

+0

Irgendeine Idee, wie man Sättigung von 0-1 in den Sättigungswert umwandelt, den MS Paint benutzt (dh Skala 0-240)? –

1

FIRST: stellen Sie sicher, eine Farbe als Bitmap haben, wie folgt aus: (! E aus dem meine Farbe gepflückt Event-Handler wich ist)

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

Was ich tat, als ich dies hatte Problem a Whilke vor, ich habe zuerst die rgba (rot, grün, blau und alpha) Werte. Als nächstes habe ich 3 Floats erstellt: Float-Farbton, Float-Sättigung, Float-Helligkeit.Dann tun Sie einfach:

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

Die ganze Menge sieht wie folgt aus:

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(); 

Wenn Sie nun, um sie anzuzeigen in einem Etikett möchten, gerade tun:

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

Hier gehen Sie , Sie haben jetzt RGB-Werte in HSV-Werte :)

Hoffe das hilft