颜色转换

颜色转换:

/**
 *
 * *-------------------*
 * |  *** 颜色转换 ***  |
 * *-------------------*
 *
 * 编辑修改收录:fengzi(疯子、wu341、wgq341)
 *
 * 不会写代码,我是代码搬运工。
 *
 * 联系方式:QQ(493712833)。
 *
 * 随   笔: https://www.cnblogs.com/fengziwu/
 *
 * 版权协议:请自觉遵守LGPL协议,欢迎修改、复制、转载、传播给更多需要的人。
 * 免责声明:任何因使用此软件导致的纠纷与软件/程序开发者无关。
 * 日   期: 2019.05.08
 */

package fengzi.colors
{
	public class ConvertColor
	{
		/**
		 * 将RGB转为HSB
		 * @param r int 红色通道值
		 * @param g int 绿色通道值
		 * @param b int 蓝色通道值
		 * @return 一个包含h,s和b三个属性的对象(色相0~360,饱和度0~100,亮度0~100)
		 **/
		public static function RGBToHSB(r:int,g:int,b:int):Object
		{
			var hsb:Object = new Object();
			//HSB模式需要经常用到RGB中的最大,最小值,故先拿个变量存起来
			var max:Number = Math.max(r,g,b);
			var min:Number = Math.min(r,g,b);
			//饱和度和亮度的计算比较简单,按着公式来写即可
			hsb.s = (max != 0) ? (max - min) / max * 100:0;
			hsb.b = max / 255 * 100;
			//h比较麻烦,要分情况,但是写起来也不算复杂
			if (hsb.s == 0)
			{
				hsb.h = 0;
			}
			else
			{
				switch (max)
				{
					case r :
						hsb.h = ((g - b)/(max - min)*60 + 360) % 360;
						break;
					case g :
						hsb.h = (b - r) / (max - min) * 60 + 120;
						break;
					case b :
						hsb.h = (r - g) / (max - min) * 60 + 240;
						break;
				}
			}
			//这段代码拿来防止数值溢出的,实际上,只要计算的时候小心点,控制上下限的操作可有可无
			hsb.h = Math.min(360,Math.max(0,Math.round(hsb.h)));
			hsb.s = Math.min(100,Math.max(0,Math.round(hsb.s)));
			hsb.b = Math.min(100,Math.max(0,Math.round(hsb.b)));
			return hsb;
		}
		/**
		 * 将HSB转为RGB(色相0~360,饱和度0~100,亮度0~100)
		 * @param h int 色相值
		 * @param s int 饱和度值
		 * @param b int 亮度值
		 * @return 一个包含r,g和b三个属性的对象
		 **/
		public static function HSBToRGB(h:int,s:int,b:int):Object
		{
			var rgb:Object = new Object();
			//按RGB转HSB的公式,拿到最大和最小值
			var max:Number = (b * 0.01) * 255;
			var min:Number = max * (1 - (s * 0.01));
			//然后根据色相的运算方法,确定max和min值花落谁家
			if (h == 360)
			{
				h = 0;
			}
			if (s == 0)
			{
				rgb.r = rgb.g = rgb.b = b * (255 * 0.01);
			}
			else
			{
				var _h:Number = Math.floor(h / 60);
				switch (_h)
				{
					case 0 :
						rgb.r = max;
						rgb.g = min + h * (max - min) / 60;
						rgb.b = min;
						break;
					case 1 :
						rgb.r = max - (h - 60) * (max - min) / 60;
						rgb.g = max;
						rgb.b = min;
						break;
					case 2 :
						rgb.r = min;
						rgb.g = max;
						rgb.b = min + (h - 120) * (max - min) / 60;
						break;
					case 3 :
						rgb.r = min;
						rgb.g = max - (h - 180) * (max - min) / 60;
						rgb.b = max;
						break;
					case 4 :
						rgb.r = min + (h - 240) * (max - min) / 60;
						rgb.g = min;
						rgb.b = max;
						break;
					case 5 :
						rgb.r = max;
						rgb.g = min;
						rgb.b = max - (h - 300) * (max - min) / 60;
						break;
					case 6 :
						rgb.r = max;
						rgb.g = min + h * (max - min) / 60;
						rgb.b = min;
						break;
				}
				//不多说了,也是防止数据溢出的代码
				rgb.r = Math.min(255,Math.max(0,Math.round(rgb.r)));
				rgb.g = Math.min(255,Math.max(0,Math.round(rgb.g)));
				rgb.b = Math.min(255,Math.max(0,Math.round(rgb.b)));
			}
			return rgb;
		}

		public static function RGBToHSL(r:int,g:int,b:int):Object
		{
			var innerR:Number = r / 255;
			var innerG:Number = g / 255;
			var innerB:Number = b / 255;
			var hsl:Object = new Object();
			var min:Number = Math.min(innerR,innerG,innerB);
			var max:Number = Math.max(innerR,innerG,innerB);
			var delta:Number = max - min;
			hsl.l = (max + min) / 2;
			if (delta == 0)
			{
				hsl.h = 0;
				hsl.s = 0;
			}
			else
			{
				if (hsl.l < 0.5)
				{
					hsl.s = delta / (max + min);
				}
				else
				{
					hsl.s = delta / ( 2 - max - min);
				}
				if (hsl.s == 0)
				{
					hsl.h = 0;
				}
				else
				{
					switch (max)
					{
						case innerR :
							hsl.h = ((innerG - innerB)/(max - min) * 60 + 360) % 360;
							break;
						case innerG :
							hsl.h = (innerB - innerR) / (max - min) * 60 + 120;
							break;
						case innerB :
							hsl.h = (innerR - innerG) / (max - min) * 60 + 240;
							break;
					}
				}
			}
			hsl.l *=  100;
			hsl.s *=  100;
			return hsl;
		}

		/**
		 * 将HSL转为RGB(h=0~360,s=0~100,l=0~100)
		 * 
		 **/
		public static function HSLToRGB(h:int, s:int, l:int):Object
		{
			var rgb:Object = new Object();
			var innerH:Number = h / 360;
			var innerS:Number = s / 100;
			var innerL:Number = l / 100;
			if ( s == 0 )
			{
				rgb.r = innerL * 255;
				rgb.g = innerL * 255;
				rgb.b = innerL * 255;
			}
			else
			{
				var var2:Number;
				if ( innerL < 0.5 )
				{
					var2 = innerL * (1 + innerS);
				}
				else
				{
					var2 = ( innerL + innerS ) - ( innerS * innerL );
				}
				var var1:Number = 2 * innerL - var2;
				rgb.r = 255 * HueToRGB(var1,var2,innerH + (1 / 3));
				rgb.g = 255 * HueToRGB(var1,var2,innerH);
				rgb.b = 255 * HueToRGB(var1,var2,innerH - (1 / 3));
			}
			return rgb;
		}
		
		/**
		 * 将rgb转为16进制
		 * @param      r int 红色通道值
		 * @param      g int 绿色通道值
		 * @param      b int 蓝色通道值
		 * @return     16进制颜色值
		 **/
		public static function RGBToHex(r:int,g:int,b:int):uint
		{
			var hex:uint = r<<16 | g<<8 | b;
			return hex;
		}
		
		/**
		* 将16进制转为RGB
		* @param      value    16进制颜色值
		* @return     一个包含r,g和b三个属性的对象
		*/
		public static function HexToRGB(value:uint):Object{
			var rgb:Object = new Object();
			rgb.r = (value >> 16) & 0xFF
			rgb.g = (value >> 8) & 0xFF
			rgb.b = value & 0xFF			
			return rgb;
		}



		

		private static function HueToRGB( v1:Number, v2:Number, vH:Number):Number
		{
			if ( vH < 0 )
			{
				vH +=  1;
			}
			if ( vH > 1 )
			{
				vH -=  1;
			}
			if ( ( 6 * vH ) < 1 )
			{
				return ( v1 + ( v2 - v1 ) * 6 * vH );
			}
			if ( ( 2 * vH ) < 1 )
			{
				return ( v2 );
			}
			if ( ( 3 * vH ) < 2 )
			{
				return ( v1 + ( v2 - v1 ) * ( ( 2 / 3 ) - vH ) * 6 );
			}
			return ( v1 );
		}
	}

}

  

原文地址:https://www.cnblogs.com/fengziwu/p/10908985.html