c# colors rgb hsv

c# - ¿Cómo cambiar el color RGB a HSV?



colors (6)

¿Cómo cambiar el color RGB a HSV? En lenguaje C #. Busco un método muy rápido sin ninguna biblioteca externa.



Esta es la versión de VB.net que funciona bien para mí portado desde el código C en la publicación de BlaM.

Hay una implementación de C aquí:

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

Debería ser muy sencillo convertirlo a C #, ya que casi no se llaman funciones, solo cálculos.

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


¿Ha considerado simplemente usar System.Drawing namespace? Por ejemplo:

System.Drawing.Color color = System.Drawing.Color.FromArgb(red, green, blue); float hue = color.GetHue(); float saturation = color.GetSaturation(); float lightness = color.GetBrightness();

Tenga en cuenta que no es exactamente lo que ha pedido (consulte las diferencias entre HSL y HSV y la clase Color no tiene una conversión de HSL / HSV, pero la última es razonablemente fácil de agregar .



Tenga en cuenta que Color.GetSaturation() y Color.GetBrightness() devuelven valores HSL, no HSV.
El siguiente código demuestra la diferencia.

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

El siguiente código C # es lo que quieres. Convierte entre RGB y HSV utilizando los algoritmos descritos en Wikipedia . Los rangos son 0 - 360 para el hue y 0 - 1 para la saturation o el 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); }


PRIMERO: asegúrese de tener un color como un mapa de bits, como este:

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

(e es del controlador de eventos que eligió mi color!)

Lo que hice cuando tuve este problema hace un rato, primero obtuve los valores de rgba (rojo, verde, azul y alfa). A continuación, creé 3 flotantes: tono flotante, saturación flotante, brillo flotante. Entonces simplemente haces:

hue = yourcolor.Gethue; saturation = yourcolor.GetSaturation; brightness = yourcolor.GetBrightness;

Todo el lote se ve así:

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 ahora desea mostrarlos en una etiqueta, solo haga lo siguiente:

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

Aquí tienes, ahora tienes valores RGB en valores HSV :)

Espero que esto ayude