zoukankan      html  css  js  c++  java
  • 颜色计算(颜色的加减混合、比较)

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

    /**
     *
     * *-----------------------------------------*
     * |  *** 颜色计算(颜色的加减混合、比较) ***  |
     * *-----------------------------------------*
     *
     * 编辑修改收录: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 ];
    		}
    
    
    	}
    }
    

      

  • 相关阅读:
    POJ 3253 Fence Repair
    POJ 2431 Expedition
    NYOJ 269 VF
    NYOJ 456 邮票分你一半
    划分数问题 DP
    HDU 1253 胜利大逃亡
    NYOJ 294 Bot Trust
    NYOJ 36 最长公共子序列
    HDU 1555 How many days?
    01背包 (大数据)
  • 原文地址:https://www.cnblogs.com/fengziwu/p/10908916.html
Copyright © 2011-2022 走看看