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 ];
    		}
    
    
    	}
    }
    

      

  • 相关阅读:
    Django tutorial part2
    Django tutorial part1
    webpy使用mysql数据库操作(web.database)
    Sicily 1031. Campus 解题报告
    Sicily 1321. Robot 解题报告
    Sicily 1940. Ordering Tasks 解题报告
    Sicily 1936. Knight Moves 解题报告
    Java多线程21:多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask
    Java多线程20:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger
    Java多线程19:定时器Timer
  • 原文地址:https://www.cnblogs.com/fengziwu/p/10908916.html
Copyright © 2011-2022 走看看