你的位置:首页 > ASP.net教程

[ASP.net教程]C# RGB和HSB相互转换


背景 

    最近做的项目中有这样一个场景,设置任意一种颜色,得到这种颜色偏深和偏浅的两种颜色。也就是说取该颜色同色系的深浅两种颜色。首先想到的是调节透明度,但效果不理想。后来尝试调节颜色亮度,发现这才是正解。但是.NET中不能直接改变Color的亮度,需要将Color转换成HSB模式,然后改变B的值调节亮度。调节亮度后需要再转换成我们熟悉的RGB模式才能使用。下面给出颜色转换方法。

 

代码 

 1   /// <summary> 2   /// 颜色转换帮助类 3   /// </summary> 4   public class ColorConversionHelper 5   { 6     /// <summary> 7     /// RGB转HSB 8     /// </summary> 9     /// <param name="red">红色值</param>10     /// <param name="green">绿色值</param>11     /// <param name="blue">蓝色值</param>12     /// <returns>返回:HSB值集合</returns>13     public static List<float> RGBtoHSB(int red, int green, int blue)14     {15       List<float> hsbList = new List<float>();16       System.Drawing.Color dColor = System.Drawing.Color.FromArgb(red, green, blue);17       hsbList.Add(dColor.GetHue());18       hsbList.Add(dColor.GetSaturation());19       hsbList.Add(dColor.GetBrightness());20       return hsbList;21     }22 23 24     /// <summary>25     /// HSB转RGB26     /// </summary>27     /// <param name="hue">色调</param>28     /// <param name="saturation">饱和度</param>29     /// <param name="brightness">亮度</param>30     /// <returns>返回:Color</returns>31     public static Color HSBtoRGB(float hue, float saturation, float brightness)32     {33       int r = 0, g = 0, b = 0;34       if (saturation == 0)35       {36         r = g = b = (int)(brightness * 255.0f + 0.5f);37       }38       else39       {40         float h = (hue - (float)Math.Floor(hue)) * 6.0f;41         float f = h - (float)Math.Floor(h);42         float p = brightness * (1.0f - saturation);43         float q = brightness * (1.0f - saturation * f);44         float t = brightness * (1.0f - (saturation * (1.0f - f)));45         switch ((int)h)46         {47           case 0:48             r = (int)(brightness * 255.0f + 0.5f);49             g = (int)(t * 255.0f + 0.5f);50             b = (int)(p * 255.0f + 0.5f);51             break;52           case 1:53             r = (int)(q * 255.0f + 0.5f);54             g = (int)(brightness * 255.0f + 0.5f);55             b = (int)(p * 255.0f + 0.5f);56             break;57           case 2:58             r = (int)(p * 255.0f + 0.5f);59             g = (int)(brightness * 255.0f + 0.5f);60             b = (int)(t * 255.0f + 0.5f);61             break;62           case 3:63             r = (int)(p * 255.0f + 0.5f);64             g = (int)(q * 255.0f + 0.5f);65             b = (int)(brightness * 255.0f + 0.5f);66             break;67           case 4:68             r = (int)(t * 255.0f + 0.5f);69             g = (int)(p * 255.0f + 0.5f);70             b = (int)(brightness * 255.0f + 0.5f);71             break;72           case 5:73             r = (int)(brightness * 255.0f + 0.5f);74             g = (int)(p * 255.0f + 0.5f);75             b = (int)(q * 255.0f + 0.5f);76             break;77         }78       }79       return Color.FromArgb(Convert.ToByte(255), Convert.ToByte(r), Convert.ToByte(g), Convert.ToByte(b));80     }81   }

 

 

扩展阅读

http://stackoverflow.com/questions/4106363/converting-rgb-to-hsb-colors

http://my.oschina.net/soitravel/blog/79862