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转RGB
26         /// </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             else
39             {
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

 

转载于:https://www.cnblogs.com/leolion/p/4732935.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值