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

      

  • 相关阅读:
    推荐一波好的代码托管
    二十一、如何导入svg图片
    二十、滑动开关css
    十九、CSS如何引入字体
    十八、移动端rem布局
    十五、css3 Filter--滤镜
    十四、css动画基础知识
    十三、初始化标签默认样式
    十二、移动端头部声明
    十一、使用a标签打电话、发短信、发邮件
  • 原文地址:https://www.cnblogs.com/fengziwu/p/10908985.html
Copyright © 2011-2022 走看看