如何将RGB颜色更改为HSV?

如何将RGB颜色更改为HSV? 用C#语言。 我search非常快的方法,没有任何外部库。

你有没有考虑过使用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之间的差异 ,而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#代码是你想要的。 它使用维基百科上描述的algorithm在RGB和HSV之间进行转换。 hue的范围是huesaturationvalue的范围是hue

 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#,因为几乎没有函数被调用 – 只是计算。

通过Googlefind

EasyRGB具有许多色彩空间转换。 这里是 RGB-> HSV转换的代码 。

这是VB.net版本,它适用于BlaM的post中的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 

首先:确保你有一个位图的颜色,像这样:

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

(e是来自事件处理程序,挑选我的颜色!)

当我在前一个问题上遇到这个问题时,我首先得到了rgba(红色,绿色,蓝色和alpha)值。 接下来,我创build了3个浮动:浮动色调,浮动饱和度,浮动亮度。 那么你只需做:

 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值:)

希望这可以帮助