顏色計算(顏色的加減混合、比較)


顏色計算(顏色的加減混合、比較):

/**
 *
 * *-----------------------------------------*
 * |  *** 顏色計算(顏色的加減混合、比較) ***  |
 * *-----------------------------------------*
 *
 * 編輯修改收錄: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 ];
		}


	}
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM