Notez que Color.GetSaturation()
et Color.GetBrightness()
renvoient des valeurs HSL, et non HSV.
Le code suivant dé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 RGB et HSV en utilisant les algorithmes décrits dans le document Wikipedia . Les plages sont de 0 à 360 pour hue
et 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);
}
34 votes
Pas un exact dupliqué. HSL != HSV.
0 votes
Que faire pour adapter le code du post HSL pour l'utiliser dans la solution HSV ?
8 votes
Wikipedia : Les deux sont mathématiquement cylindriques, mais HSV peut être considéré conceptuellement comme un cône inversé de couleurs, HSL représente conceptuellement un double-cône ou une sphère. Alors que la "teinte" dans HSL et HSV fait référence au même attribut, leurs définitions de la "saturation" diffèrent considérablement.
2 votes
@Adam : J'aimerais que les gens de Paint.NET puissent comprendre ça ! :)
4 votes
Je répète : Le HSV est très différent de la LSH. HSV est parfois connu sous le nom de HSB (surtout dans Photoshop, et dans .NET).