Как изменить цвет RGB на HSV?

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

Рассматривали ли вы просто использование пространства имен 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(); 

Обратите внимание, что это не совсем то, о чем вы просили (см. Различия между HSL и HSV, а class Color не имеет возврата обратно из HSL / HSV, но последнее достаточно легко добавить .

Обратите внимание, что 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 с использованием алгоритмов, описанных в Википедии . Диапазоны 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); } 

Здесь реализована реализация C:

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

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

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

EasyRGB имеет много цветовых преобразований. Вот код для преобразования RGB-> HSV.

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

Здесь реализована реализация 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 

FIRST: убедитесь, что у вас есть цвет в виде растрового изображения, например:

 Bitmap bmp = (Bitmap)pictureBox1.Image.Clone(); paintcolor = bmp.GetPixel(eX, eY); 

(e из обработчика событий, который выбрал мой цвет!)

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

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

Вся эта партия выглядит так:

 Bitmap bmp = (Bitmap)pictureBox1.Image.Clone(); paintcolor = bmp.GetPixel(eX, eY); 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 🙂

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

  • Как преобразовать шестнадцатеричную строку RGB в UIColor в объекте-c?
  • Изменение оттенка цвета RGB
  • C # преобразовать значение RGB в CMYK с помощью профиля ICC?
  • Есть ли веские причины для использования шестнадцатеричных значений по десятичной для значений цвета RGB в CSS?
  • RGB для CMYK и алгоритм обратной связи
  • Формула для определения яркости цвета RGB
  • Цветовой индекс Star BV до уровня RGB
  • Преобразование значения цвета RGB в шестнадцатеричное
  • Название цвета базы данных RGB
  • Создание gradleиентов программным путем?
  • Извлечь черно-белое изображение из формата NV21 от андроидной камеры
  • Давайте будем гением компьютера.