2008-12-11 4 views
57

Как изменить цвет RGB на HSV? На языке C#. Я ищу очень быстрый метод без какой-либо внешней библиотеки.Как изменить цвет RGB на HSV?

+31

Не дубликат _exact_. HSL! = HSV. – 2008-12-11 15:01:59

+0

Что нужно сделать, чтобы адаптировать код из сообщения HSL для использования в решении HSV? – 2008-12-11 15:03:32

+7

Wikipedia: оба являются математически цилиндрическими, но HSV можно концептуально рассматривать как перевернутый конус цветов, HSL концептуально представляет собой двойной конус или сферу. Хотя «оттенок» в HSL и HSV относится к одному и тому же атрибуту, их определения «насыщенности» сильно различаются. – BlaM 2008-12-11 15:05:20

ответ

26

Рассматривали ли вы просто с помощью System.Drawing пространства имен? Например:.

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

Заметим, что это не совсем то, что вы просили (см differences between HSL and HSV и класс Цвет не имеет преобразование назад от HSL/HSV, но последний является достаточно easy to add

5

Там есть реализация C здесь:

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

Должен быть очень просто преобразовать в C#, так как почти никаких функций не называются - только расчеты.

найден через Google

3

Этом это версия VB.net, который отлично работает для меня портирован из кода C в посте Блама в

Там есть реализация C здесь:.

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

Должно быть очень простым преобразовать в C#, так как почти никакие функции не называются - просто> вычислениями.


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 
93

Обратите внимание, что Color.GetSaturation() и Color.GetBrightness() возвращаемые значения HSL, а не HSV.
Следующий код демонстрирует разницу.

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 

Следующий код C# - это то, что вы хотите. Он преобразует RGB и HSV с использованием алгоритмов, описанных на Wikipedia. Диапазоны составляют 0 - 360 для hue и 0 - 1 для saturation или 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); 
} 
4

EasyRGB имеет много преобразований цветового пространства. Here is the code для преобразования RGB-> HSV.

1

ПЕРВЫЙ: убедитесь, что у вас есть цвет как растровое изображение, как это: (! Е из обработчика событий Wich выбрал мой цвет)

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

То, что я сделал, когда я имел это проблема в whilke ago, я сначала получил значения rgba (красный, зеленый, синий и альфа). Далее я создал 3 поплавка: поплавок, насыщенность поплавка, яркость поплавка.Тогда вы просто сделать:

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

Вся серия выглядит следующим образом:

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(); 

Если вы теперь хотите, чтобы отобразить их в этикетке, просто сделать:

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

Здесь вы идете , у вас теперь есть значения RGB в значениях HSV :)

Надеюсь, что это поможет