AS3 颜色操作函数库

package lib.base.maths

{

         /**
          * 颜色转换函数库
          * <p>
          * 作者:Brant.Hu<br>
          * 日期:2009<br>
          */
         publicclass  CColorMath extends Object
         {
                   /**
                    * RGB颜色互补色减法混合
                    * @param      color1
                    * @param      color2
                    * @return
                    * <p>
                    * <listing>
                    * import lib.base.maths.CColorMath;
                    *
                    * var color1:uint = 0xFD6A2D;
                    * var color2:uint = 0xA221A3;
                    * var color3:uint = 0xFF0000;
                    *
                    * var circle1:Shape = new Shape();
                    * var circle2:Shape = new Shape();
                    * var circle3:Shape = new Shape();
                    * circle2.y = 100;
                    * circle3.y = 200;
                    * shapeRedraw(circle1, color1);
                    * shapeRedraw(circle2, color2);
                    * shapeRedraw(circle3, color3);
                    * addChild(circle1);
                    * addChild(circle2);
                    * addChild(circle3);
                    *
                    * var btn:Sprite = new Sprite();
                    * btn.x = 200;
                    * btn.y = 200;
                    * shapeRedraw(btn, 0);
                    * addChild(btn);
                    * btn.addEventListener(MouseEvent.CLICK,onMouseClick);
                    * function onMouseClick(evt:MouseEvent):void
                    * {
                    *             color3= CColorMath.subTract(color1, color2);
                    *             shapeRedraw(circle3,color3);
                    * }
                    *
                    * function shapeRedraw(shape:*,color:uint):void
                    * {
                    *             shape.graphics.clear();
                    *             shape.graphics.beginFill(color);
                    *             shape.graphics.drawRect(0,0, 100, 60);
                    *             shape.graphics.endFill();
                    * }
                    * </listing>
                    */
                   publicstatic function subTract(color1:uint, color2:uint):uint
                   {
                            vara:Array = toARGB(color1);
                            varb:Array = toARGB(color2);
                            varmr:uint = Math.max(Math.max(b[0] - (256 - a[0]), a[0] - (256 - b[0])), 0);
                            varmg:uint = Math.max(Math.max(b[1] - (256 - a[1]), a[1] - (256 - b[1])), 0);
                            varmb:uint = Math.max(Math.max(b[2] - (256 - a[2]), a[2] - (256 - b[2])), 0);
                            returntoDec(mr, mg, mb);
                   }

                   /**
                    * RGB颜色加法混合. 示例参考"GB颜色互补色减法混合"中的例子
                    *
                    * @param      color1
                    * @param      color2
                    * @return
                    */
                   publicstatic function sum(color1:uint, color2:uint):uint
                   {
                            vara:Array = toARGB(color1);
                            varb:Array = toARGB(color2);
                            varmr:uint = Math.min(a[0] + b[0], 255);
                            varmg:uint = Math.min(a[1] + b[1], 255);
                            varmb:uint = Math.min(a[2] + b[2], 255);
                            returntoDec(mr, mg, mb);
                   }

                   /**
                    * RGB颜色减法混合.示例参考"GB颜色互补色减法混合"中的例子
                    *
                    * @param      color1
                    * @param      color2
                    * @return
                    */
                   publicstatic function sub(color1:uint , color2:uint):uint
                   {
                            vara:Array = toARGB(color1);
                            varb:Array = toARGB(color2);
                            varmr:uint = Math.max(a[0] - b[0], 0);
                            varmg:uint = Math.max(a[1] - b[1], 0);
                            varmb:uint = Math.max(a[2] - b[2], 0);
                            returntoDec(mr, mg, mb);
                   }
                  
                 
                   /**
                    * 取两个颜色的暗调.示例参考"GB颜色互补色减法混合"中的例子
                    *
                    * @param      color1
                    * @param      color2
                    * @return
                    */
                   publicstatic function min(color1:uint, color2:uint):uint
                   {
                            vara:Array = toARGB(color1);
                            varb:Array = toARGB(color2);
                            varmr:uint = Math.min(a[0], b[0]);
                            varmg:uint = Math.min(a[1], b[1]);
                            varmb:uint = Math.min(a[2], b[2]);
                            returntoDec(mr, mg, mb);
                   }
                  
                   /**
                    * 取两个颜色的明调.示例参考"GB颜色互补色减法混合"中的例子
                    *
                    * @param      color1
                    * @param      color2
                    * @return
                    */
                   publicstatic function max(color1:uint, color2:uint):uint
                   {
                            vara:Array = toARGB(color1);
                            varb:Array = toARGB(color2);
                            varmr:uint = Math.max(a[0], b[0]);
                            varmg:uint = Math.max(a[1], b[1]);
                            varmb:uint = Math.max(a[2], b[2]);
                            returntoDec(mr, mg, mb);
                   }
                  
                  
                   /**
                    * 拆分ARGB颜色,返回包含R,G,B,A通道值的数组
                    * @param      color  要分解的ARGB颜色数值
                    * @return
                    *
                    * <listing>
                    * import lib.base.maths.CColorMath;
                    * var color:uint = 0xFF80FFFF;
                    * trace(CColorMath.toARGB(color));//128,255,255,255
                    * </listing>
                    */
                   public static functiontoARGB(color:uint):Array
                   {
                            vara:uint = color >> 24 & 0xFF;
                            varr:uint = color >> 16 & 0xFF;
                            varg:uint = color >> 8 & 0xFF;
                            varb:uint = color & 0xFF;
                            return[r, g, b, a];
                   }
                  
                  
                   /**
                    * 合并A,R,G,B颜色通道
                    * @param      r  红色通道
                    * @param      g  绿色通道
                    * @param      b  蓝色通道
                    * @param      a  透明度
                    * @return
                    */
                   publicstatic function toDec(r:uint, g:uint, b:uint, a:uint = 255):uint
                   {
                            varsa:uint = a << 24;
                            varsr:uint = r << 16;
                            varsg:uint = g << 8;
                            returnsa | sr | sg | b;
                   }
                  
                  
                   /**
                    * RGB颜色转换为HSV颜色
                    * @param      r  红色通道
                    * @param      g  绿色通道
                    * @param      b  蓝色通道
                    * @return
                    *
                    * H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,红、绿、蓝分别相隔120度。互补色分别相差180
                    * 度。纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰度。V表示色
                    * 彩的明亮程度,范围从0到1。有一点要注意:它和光强度之间并没有直接的联系.RGB转化到HSV的算法如下:
                    *
                    * <listing>
                    * max=max(R,G,B) 
                    * min=min(R,G,B) 
                    * if R = max, H = (G-B)/(max-min) 
                    * if G = max, H = 2 + (B-R)/(max-min) 
                    * if B = max, H = 4 + (R-G)/(max-min) 
                    *
                    * H = H * 60 
                    * if H < 0, H = H + 360 
                    *
                    * V=max(R,G,B) 
                    * S=(max-min)/max
                    * </listing>
                    */
                   publicstatic function rToH(r:uint, g:uint, b:uint):Array
                   {
                            varh:Number = 0;
                            varv:Number = 0;
                            vars:Number = 0;
                            varmax:uint = v = Math.max(Math.max(r, g), b);
                            varmin:uint = Math.min(Math.min(r, g), b);
                            varsub:uint = max - min;
                            switch(max)
                            {
                                     caser:
                                               h= (g - b) / sub;
                                               break;
                                     caseg:
                                               h= 2 + (b - r) / sub;
                                               break;
                                     caseb:
                                               h= 4 + (r - g) / sub;
                                               break;
                            }
                            if((h *= 60) < 0)
                                     h+= 360;
                            s= sub / max;
                            return[h, s, v];
                   }
                  
                
                   /**
                    * HSV颜色转换为RGB颜色
                    * @param      h
                    * @param      s
                    * @param      v
                    * @return
                    *
                    * HSV颜色到RGB颜色的转化公式如下:
                    * <listing>
                    * if s = 0   
                    * R=G=B=V 
                    * else   
                    * H /= 60;   
                    * i = INTEGER(H)
                    *
                    * f = H - i   
                    * a = V * ( 1 - s )   
                    * b = V * ( 1 - s * f )   
                    * c = V * ( 1 - s * (1 - f ) )   
                    *
                    * switch(i)     
                    * case 0: R = V; G = c; B = a;     
                    * case 1: R = b; G = v; B = a;     
                    * case 2: R = a; G = v; B = c;     
                    * case 3: R = a; G = b; B = v;     
                    * case 4: R = c; G = a; B = v;     
                    * case 5: R = v; G = a; B = b;
                    * </listing>
                    */
                   publicstatic function hToR(h:Number, s:Number, v:Number):Array
                   {
                            varr:uint;
                            varg:uint;
                            varb:uint;
                            vari:uint;
                            if(!s)
                                     r= g = b = v;
                            else
                            {
                                     h/= 60;
                                     i= uint(h);
                            }
                            varf:uint = h - i;
                            var x:uint = v * (1 - s);
                            vary:uint = v * (1 - s * f);
                            varz:uint = v * (1 - s * (1 - f));
                            switch(i)
                            {
                                     case0: r = v; g = z; b = x; break;     
                                     case1: r = y; g = v; b = x; break;       
                                     case2: r = x; g = v; b = z; break;        
                                     case3: r = x; g = y; b = v; break;       
                                     case4: r = z; g = x; b = v; break;       
                                     case5: r = v; g = x; b = y; break;  
                            }
                            return[r, g, b];
                   }
                
         }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值