web-dev-qa-db-fra.com

Comment changer la couleur RVB en HSV?

Comment changer la couleur RVB en HSV? En langage C #, je recherche une méthode très rapide sans aucune bibliothèque externe.

61
Tomasz Smykowski

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 .

26
georged

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);
}
98
Greg

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

5
BlaM

EasyRGB comporte de nombreuses conversions d'espace colorimétrique. Voici le code pour la conversion RVB-> HSV.

4
David Pointer

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
3
Captain Lepton

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

0
Matthiaantje