颜色计算(颜色的加减混合、比较)

颜色计算(颜色的加减混合、比较):

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

	public class ColorMath
	{

		/**
		* 减法
		* 返回从两个RGB的数值(0x000000~0xFFFFFF)减去的数值。
		* 如果将指示ARGB的数值传送给参数,则将忽略α值。
		* @param    col1         表示RGB的数值(0x000000~0xFFFFFF)
		* @param    col2         表示RGB的数值(0x000000~0xFFFFFF)
		* @return   减法混合值
		* trace( ColorMath.subtract( 0xFFFF00 , 0x666666 ).toString(16) );//输出: 656500
		*/
		public static function subtract( col1:Number , col2:Number ):Number
		{
			var a = toRGB(col1);
			var b = toRGB(col2);
			var nr = Math.max(Math.max(b[0] - (256 - a[0]),a[0] - (256 - b[0])),0);
			var ng = Math.max(Math.max(b[1] - (256 - a[1]),a[1] - (256 - b[1])),0);
			var nb = Math.max(Math.max(b[2] - (256 - a[2]),a[2] - (256 - b[2])),0);
			return toDec( nr , ng , nb );
		}



		/**
		* 加法混合色
		* 返回从两个RGB的数值(0x000000~0xFFFFFF)到加法混合的数值。
		* 如果将指示ARGB的数值传送给参数,则将忽略α值。
		* @param        col1            表示RGB的数值(0x000000~0xFFFFFF)
		* @param        col2            表示RGB的数值(0x000000~0xFFFFFF)
		* @return       加法混合值
		* trace( ColorMath.sum( 0xFFFF00 , 0x666666 ).toString(16) );//输出: ffff66
		*/
		public static function sum( col1:Number , col2:Number ):Number
		{
			var a = toRGB(col1);
			var b = toRGB(col2);
			var nr = Math.min(a[0] + b[0],255);
			var ng = Math.min(a[1] + b[1],255);
			var nb = Math.min(a[2] + b[2],255);
			return toDec( nr , ng , nb );
		}

		/**
		* 減法混色
		* 返回从两个RGB的数值(0x000000~0xFFFFFF)到减法混合的数值。
		* 如果将指示ARGB的数值传送给参数,则将忽略α值。
		* 
		* @param        col1            表示RGB的数值(0x000000~0xFFFFFF)
		* @param        col2            表示RGB的数值(0x000000~0xFFFFFF)
		* @return    减法混色値
		* 
		* trace( ColorMath.sub( 0xFFFF00 , 0x666666 ).toString(16) ); // 出力 : 999900
		*
		*/
		public static function sub( col1:Number , col2:Number ):Number
		{
			var a = toRGB(col1);
			var b = toRGB(col2);
			var nr = Math.max(a[0] - b[0],0);
			var ng = Math.max(a[1] - b[1],0);
			var nb = Math.max(a[2] - b[2],0);
			return toDec( nr , ng , nb );
		}

		/**
		* 比较(黑暗)
		* 从两个RGB的数值(0x000000~0xFFFFFF)比较,返回RGB各自数值较低的数值。
		* 如果将指示ARGB的数值传送给参数,则将忽略α值。
		* 
		* @param        col1            表示RGB的数值(0x000000~0xFFFFFF)
		* @param        col2            表示RGB的数值(0x000000~0xFFFFFF)
		* @return       比较(暗)值
		* 
		* trace( ColorMath.min( 0xFFFF00 , 0x666666 ).toString(16) ); // 出力 : 666600
		*
		*/
		public static function min( col1:Number , col2:Number ):Number
		{
			var a = toRGB(col1);
			var b = toRGB(col2);
			var r = Math.min(a[0],b[0]);
			var g = Math.min(a[1],b[1]);
			var b = Math.min(a[2],b[2]);
			return toDec( r , g , b );
		}

		/**
		* 比较(明)
		* 从两个RGB的数值(0x000000~0xFFFF F)比较,返回RGB分别以高数值计算的数值。
		* 如果将指示ARGB的数值传送给参数,则将忽略α值。
		* 
		* @param        col1            表示RGB的数值(0x000000~0xFFFFFF)
		* @param        col2            表示RGB的数值(0x000000~0xFFFFFF)
		* @return       比较(明)值
		* >
		* trace( ColorMath.max( 0xFFFF00 , 0x666666 ).toString(16) ); // 出力 : ffff66
		* 
		*/
		public static function max( col1:Number , col2:Number ):Number
		{
			var a = toRGB(col1);
			var b = toRGB(col2);
			var r = Math.max(a[0],b[0]);
			var g = Math.max(a[1],b[1]);
			var b = Math.max(a[2],b[2]);
			return toDec( r , g , b );
		}

		/**
		* 各颜色值的排列
		* @param           col           表示ARGB的数值(0x00000000到0xFFFFFFFF)
		* @return          Array         表示各颜色值的排列[ R , G , B , Alpha ]
		* 
		* trace( ColorMath.toRGB( 0xFF33699 ) );//输出: 51,102,153,255
		* 
		*/
		public static function toRGB( col:Number ):Array
		{
			if (typeof(col)=="number")
			{
				var a = Math.floor(col/16777216);
				var r = Math.floor((col-a*16777216)/65536);
				var g = Math.floor((col-(a*16777216+r*65536))/256);
				var b = Math.floor((col-(a*16777216+r*65536+g*256)));
				return [r,g,b,a];
			}
		}

		/**
		* 颜色值获得的ARGB的数字
		* 如果将指示ARGB的数值传送给参数,则将忽略α值。
		* 
		* @param        r      红
		* @param        g      绿
		* @param        b      蓝
		* @param        a      透明度
		* @return       从每个颜色值获得的ARGB的数字
		* 
		* trace( ColorMath.toDec( 51, 102 , 153, 255 ) ); // 出力 : 4281558681
		*
		*/
		public static function toDec( r:Number , g:Number , b:Number , a:Number ):Number
		{
			if (a)
			{
				return Math.floor(a)*16777216+Math.floor(r)*65536+Math.floor(g)*256+Math.floor(b);
			}
			return Math.floor(r)*65536+Math.floor(g)*256+Math.floor(b);
		}

		/**
		* RGB转换为HSV(HSB)的数组。
		* @param        r      红
		* @param        g      绿
		* @param        b      蓝
		* @return       Array  HSV[ H, S, V ] 
		* 
		* var rgb = ColorMath.toRGB( 0xFF6600 );
		* trace( ColorMath.convertHSV.apply( null , rgb ) ); // 出力 : 24,100,50
		* 
		*/
		public static function convertHSV( r:Number, g:Number, b:Number ):Array
		{
			r /=  255;
			g /=  255;
			b /=  255;
			var h = 0,s = 0,v = 0;
			var x,y;
			if (r>=g)
			{
				x = r;
			}
			else
			{
				x = g;
			}
			if (b>x)
			{
				x = b;
			}
			if (r<=g)
			{
				y = r;
			}
			else
			{
				y = g;
			}
			if (b<y)
			{
				y = b;
			}
			v = x;
			var c = x - y;
			if (x==0)
			{
				s = 0;
			}
			else
			{
				s = c / x;
			}
			if (s!=0)
			{
				if (r==x)
				{
					h = (g - b) / c;
				}
				else
				{
					if (g==x)
					{
						h = 2 + (b - r) / c;
					}
					else
					{
						if (b==x)
						{
							h = 4 + (r - g) / c;
						}
					}
				}
				h = h * 60;
				if (h<0)
				{
					h = h + 360;
				}
			}
			return [ h, s*100, v*100 ];
		}

		/**
		* HSV(HSB)转RGB[r,g,b]
		* 
		* @param        h         色相(Hue  0-360)
		* @param        s         彩度(Saturation  0-360)
		* @param        v         明度(Value  0-360)
		* @return       Array     RGB[ R, G, B ] 
		* 
		* trace( ColorMath.convertRGB( 24, 100, 50 ) ); // 出力 : 255,102,0
		* 
		*/
		public static function convertRGB( h:Number, s:Number, v:Number ):Array
		{
			s = s / 100,v = v / 100;
			var r = 0,g = 0,b = 0;
			var i,x,y,z;
			if (s<0)
			{
				s = 0;
			}
			if (s>1)
			{
				s = 1;
			}
			if (v<0)
			{
				v = 0;
			}
			if (v>1)
			{
				v = 1;
			}
			h = h % 360;
			if (h<0)
			{
				h +=  360;
			}
			h /=  60;
			i = Math.floor(h);
			x = v * (1 - s);
			y = v * (1 - s * (h - i));
			z=v*(1-s*(1-h+i));
			switch (i)
			{
				case 0 :
					r = v;
					g = z;
					b = x;
					break;
				case 1 :
					r = y;
					g = v;
					b = x;
					break;
				case 2 :
					r = x;
					g = v;
					b = z;
					break;
				case 3 :
					r = x;
					g = y;
					b = v;
					break;
				case 4 :
					r = z;
					g = x;
					b = v;
					break;
				case 5 :
					r = v;
					g = x;
					b = y;
					break;
			}
			return [ r*255, g*255, b*255 ];
		}


	}
}

  

猜你喜欢

转载自www.cnblogs.com/fengziwu/p/10908916.html