最近做的項目中有這樣一個場景,設置任意一種顏色,得到這種顏色偏深和偏淺的兩種顏色。也就是說取該顏色同色系的深淺兩種顏色。首先想到的是調節透明度,但效果不理想。後來嘗試調節顏色亮度,發現這才是正解。但是.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