当前位置: 代码迷 >> C# >> C# RGB跟HSB相互转换
  详细解决方案

C# RGB跟HSB相互转换

热度:62   发布时间:2016-05-05 03:05:05.0
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

 

1楼Sunday*
写过给css更换颜色的用到此颜色转换方法。把ext蓝色皮肤,改成5颜6色的
  相关解决方案