Comment changer la couleur RVB en HSV? En langage C #, je recherche une méthode très rapide sans aucune bibliothèque externe.
Avez-vous envisagé d'utiliser simplement l'espace de noms System.Drawing? Par exemple:
System.Drawing.Color color = System.Drawing.Color.FromArgb(red, green, blue);
float hue = color.GetHue();
float saturation = color.GetSaturation();
float lightness = color.GetBrightness();
Notez que ce n’est pas exactement ce que vous avez demandé (voir différences entre HSL et HSV et la classe Color n’a pas de conversion de HSL/HSV mais cette dernière est raisonnablement facile à ajouter .
Notez que Color.GetSaturation()
et Color.GetBrightness()
renvoient des valeurs HSL, et non HSV.
Le code suivant montre la différence.
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
Le code C # suivant est ce que vous voulez. Il convertit entre RVB et HSV en utilisant les algorithmes décrits sur Wikipedia . Les plages vont de 0 à 360 pour hue
et de 0 à 1 pour saturation
ou 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);
}
Il y a une implémentation C ici:
http://www.cs.rit.edu/~ncs/color/t_convert.html
Devrait être très simple à convertir en C #, car presque aucune fonction n’est appelée - juste des calculs.
trouvé via Google
EasyRGB comporte de nombreuses conversions d'espace colorimétrique. Voici le code pour la conversion RVB-> HSV.
Ceci est la version VB.net qui fonctionne très bien pour moi, transférée à partir du code C dans le message de BlaM.
Il y a une implémentation C ici:
http://www.cs.rit.edu/~ncs/color/t_convert.html
Devrait être très simple à convertir en C #, étant donné que presque aucune fonction n'est appelée - seulement> des calculs.
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
FIRST: assurez-vous d'avoir une couleur en tant que bitmap, comme ceci:
Bitmap bmp = (Bitmap)pictureBox1.Image.Clone();
paintcolor = bmp.GetPixel(e.X, e.Y);
(e vient du gestionnaire d’événement qui a choisi ma couleur!)
Ce que j’ai fait quand j’ai eu ce problème il ya un whilke, j’ai d’abord obtenu les valeurs de rgba (rouge, vert, bleu et alpha). Ensuite, j'ai créé 3 flotteurs: la teinte du flottant, la saturation du flottant, la luminosité du flottant. Ensuite, vous faites simplement:
hue = yourcolor.Gethue;
saturation = yourcolor.GetSaturation;
brightness = yourcolor.GetBrightness;
Le tout ressemble à ceci:
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();
Si vous voulez maintenant les afficher dans une étiquette, faites simplement:
yourlabelname.Text = hue.ToString;
yourlabelname.Text = saturation.ToString;
yourlabelname.Text = brightness.ToString;
Voilà, vous avez maintenant des valeurs RVB en valeurs HSV :)
J'espère que cela t'aides