Frage

Wie RGB-Farbe zu HSV ändern? In C # -Sprache. Ich suche für sehr schnelle Methode ohne externe Bibliothek.

War es hilfreich?

Lösung

Haben Sie darüber nachgedacht einfach System.Drawing Namespace? 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 Unterschiede zwischen HSL und HSV (gefragt haben und die Color-Klasse nicht über eine Umwandlung zurück von HSL / HSV aber letztere ist vernünftig einfach hinzufügen .

Andere Tipps

Beachten Sie, dass Color.GetSaturation() und Color.GetBrightness() Rückkehr HSL-Werte, nicht HSV.
Der folgende Code zeigt 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. Er wandelt zwischen RGB und HSV mit den auf Wikipedia . 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);
}

Es gibt eine C-Implementierung hier:

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

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

gefunden via Google

Die EasyRGB hat viele Farbraumkonvertierungen. Hier ist der Code für die RGB-> HSV Umwandlung.

Dies ist die VB.net-Version, die für mich portiert von der C-Code in BlaM die Post gut funktioniert.

  

Es gibt eine C-Implementierung hier:

     

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

     

Sollte sehr einfach sein zu C # zu konvertieren, da so gut wie 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

FIRST: Stellen Sie sicher, dass Sie eine Farbe als Bitmap, wie folgt aus:

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

(e ist von den Event-Handler weichen meine Farbe gepflückt!)

Was ich tat, als ich dieses Problem vor einem whilke hatte, bekam ich zuerst die rgba (rot, grün, blau und alpha) Werte. Als nächstes habe ich 3 Schwimmern: float Farbton, Sättigung float, 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ögen, gerade tun:

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

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

Hope, das hilft

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top