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?
Antwort
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
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
@greg: Ich stimme zu, das wird zu schrecklichen Ergebnissen führen, wie ich selbst erlebt habe. – leppie
-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) –
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
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! –
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
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);
}
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 –
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 ... –
Irgendeine Idee, wie man Sättigung von 0-1 in den Sättigungswert umwandelt, den MS Paint benutzt (dh Skala 0-240)? –
Die EasyRGB hat viele Farbraumkonvertierungen. Here is the code für die RGB-> HSV-Konvertierung.
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
Kein _exact_ Duplikat. HSL! = HSV. –
Was ist zu tun, um Code aus HSL-Post in HSV-Lösung zu verwenden? –
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