图片处理类

       此类实现了对图片处理的多种操作,如去红眼,黑白,亮度,对比度,饱和度,魔棒,裁切,球面化等功能,图片处理的实质就是针对象素的操作,每个象素都有一系列的属性,上述功能实现其实就是对一组象素进行有序的格式处理的结果.魔棒工具在更换证件照的背景比较有用.
  1. package org.filter 
  2. {
  3.   import flash.display.*;
  4.   import flash.filters.*
  5.   import flash.geom.Point;
  6.   import flash.geom.Rectangle
  7.   import flash.utils.ByteArray
  8.   /**
  9.   * ...
  10.   * @author DefaultUser (Tools -> Custom Arguments...)
  11.   */
  12.   public class Bitmapfilters extends Sprite 
  13.   {
  14.     public function Bitmapfilters() 
  15.     {
  16.       
  17.     }  
  18.     //黑白
  19.     public static function setGray(child:DisplayObject) {
  20.           /* var matrix:Array = [0.3, 0.59, 0.11, 0, 0, 
  21.                              0.3, 0.59, 0.11, 0, 0,
  22.                              0.3, 0.59, 0.11, 0, 0, 
  23.                                0,    0,    0, 1, 0];*/
  24.                      
  25.         var matrix:Array = [0.33, 0.33, 0.33, 0, 0, 
  26.                              0.33, 0.33, 0.33, 0, 0,
  27.                              0.33, 0.33, 0.33, 0, 0, 
  28.                                0,    0,    0, 1, 0];             
  29.                  var filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);
  30.                  child.filters =[filter]
  31.             }
  32.         
  33.       //亮度
  34.     public static function setBrightness(child:DisplayObject, val:Number) {
  35.             if (isNaN(val)) { return; } 
  36.       val=limitPara(val)
  37.             var matrix:Array = [1, 0, 0, 0, val, 
  38.                           0, 1, 0, 0, val, 
  39.                 0, 0, 1, 0, val, 
  40.                 0, 0, 0, 1, 0]
  41.       var filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);
  42.             child.filters =[filter]
  43.       }
  44.     
  45.     //对比度
  46.     public static function setContrast(child:DisplayObject, val:Number) {
  47.       
  48.       if (isNaN(val)) { return; } 
  49.       
  50.       val=limitPara(val)
  51.       
  52.       var DELTA_INDEX =  [0, 0.01, 0.02, 0.04, 0.05, 0.06, 0.07, 0.08, 0.1, 
  53.                           0.11, 0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.2, 
  54.                 0.21, 0.22, 0.24, 0.25, 0.27, 0.28, 
  55.                 0.3, 0.32, 0.34, 0.36, 0.38, 
  56.                 0.4, 0.42, 0.44, 0.46, 0.48, 
  57.                 0.5, 0.53, 0.56, 0.59, 
  58.                 0.62, 0.65, 0.68,
  59.                 0.71, 0.74, 0.77, 
  60.                 0.8, 0.83, 0.86, 0.89, 
  61.                 0.92, 0.95, 0.98, 
  62.                 1, 1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 
  63.                 1.54, 1.6, 1.66, 1.72, 1.78, 1.84, 1.9, 1.96, 
  64.                 2, 2.12, 2.25, 2.37, 2.5, 2.62, 2.75, 2.87, 
  65.                 3, 3.2, 3.4, 3.6, 3.8, 4, 4.3, 4.7, 4.9, 5, 5.5, 
  66.                 6, 6.5, 6.8, 7, 7.3, 7.5, 7.8, 8, 8.4, 8.7, 9, 9.4, 9.6, 9.8, 10];
  67.       var diffNum;
  68.       
  69.             if (val < 0) { 
  70.         diffNum = 127 + val / 100 * 127;
  71.       }else{
  72.         diffNum = val % 1;
  73.                 if (diffNum == 0) {
  74.           diffNum = DELTA_INDEX[val];
  75.                 }else{
  76.                     diffNum = DELTA_INDEX[val << 0] * (1 - diffNum) + DELTA_INDEX[(val << 0) + 1] * diffNum;
  77.                 } 
  78.                 diffNum = diffNum * 127 + 127;
  79.             }
  80.             var matrix:Array = [diffNum / 127, 0, 0, 0, 0.5 * (127 - diffNum),
  81.                           0, diffNum / 127, 0, 0, 0.5 * (127 - diffNum), 
  82.                 0, 0, diffNum / 127, 0, 0.5 * (127 - diffNum), 
  83.                 0, 0, 0, 1, 0]
  84.       var filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);
  85.             child.filters =[filter]
  86.       }
  87.     
  88.     //饱和度
  89.     public static function setSaturation(child:DisplayObject,val:Number){
  90.             
  91.       if (isNaN(val)) { return; } 
  92.       val = limitPara(val)
  93.       
  94.       var diffNum =1 + ((val > 0) ? ((3 * val) / 100):(val / 100))
  95.             var rr = 0.3086;
  96.             var gg = 0.6094;
  97.             var bb = 0.082;
  98.             var matrix:Array = [rr * (1 - diffNum) + diffNum, gg * (1 - diffNum), bb * (1 - diffNum), 0, 0,
  99.                             rr * (1 - diffNum), gg * (1 - diffNum) + diffNum, bb * (1 - diffNum), 0, 0,
  100.                   rr * (1 - diffNum), gg * (1 - diffNum), bb * (1 - diffNum) + diffNum, 0, 0,
  101.                   0, 0, 0, 1, 0]
  102.       var filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);
  103.             child.filters = [filter]
  104.       }
  105.       
  106.     //单色
  107.     public static function setHue(child:DisplayObject, val:Number) {
  108.       
  109.       val = val/ 180 * Math.PI;
  110.             if (isNaN(val)) { return; } 
  111.       val = limitPara(val)
  112.             var x = Math.cos(val);
  113.             var y = Math.sin(val);
  114.             var rr = 0.213;
  115.             var gg = 0.715;
  116.             var bb = 0.072;
  117.             var matrix:Array =[(rr + (x * (1 - rr))) + (y * ( -rr)), (gg + (x * ( -gg))) + (y * ( -gg)), (bb + (x * ( -bb))) + (y * (1 - bb)), 0, 0, 
  118.                          (rr + (x * ( -rr))) + (y * 0.143), (gg + (x * (1 - gg))) + (y * 0.14), (bb + (x * ( -bb))) + (y * -0.283), 0, 0,
  119.                  (rr + (x * ( -rr))) + (y * ( -(1 - rr))), (gg + (x * ( -gg))) + (y * gg), (bb + (x * (1 - bb))) + (y * bb), 0, 0,
  120.                  0, 0, 0, 1, 0]
  121.       var filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);
  122.             child.filters = [filter]
  123.       }
  124.       
  125.     //柔化
  126.         public static function setBlur(child:DisplayObject, val:Number) {
  127.       if (isNaN(val)) { return; } 
  128.       val = Math.min(val, 255)
  129.       val = Math.max(val, 0)
  130.       
  131.       var blurX:Number = val
  132.       var blurY:Number = val
  133.       var filter:BlurFilter=new BlurFilter(blurX, blurY, BitmapFilterQuality.HIGH);
  134.       child.filters = [filter];
  135.     }
  136.     
  137.     //还原
  138.     public static function reset(child:DisplayObject) {
  139.       var matrix:Array = [1, 0, 0, 0, 0, 
  140.                           0, 1, 0, 0, 0, 
  141.                 0, 0, 1, 0, 0, 
  142.                 0, 0, 0, 1, 0]
  143.       var filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);
  144.             child.filters =[filter]
  145.       }
  146.     
  147.     //去红眼
  148.     public static function RedEyeReduction(bmd:BitmapData,rec:Rectangle){
  149.        bmd.lock()
  150.              for (var i=rec.x-rec.width; i<rec.width+rec.x; i++) {
  151.                for (var j=rec.y-rec.height; j<rec.height+rec.y; j++) {
  152.                 
  153.           var pix:Number = bmd.getPixel(i, j);
  154.        
  155.                 var rr = pix >>> 16 & 255;
  156.                 var gg = pix >>> 8 & 255;
  157.                 var bb = pix & 255;
  158.                 var rrr = rr * 0.513333;
  159.                 var bbb = bb * 0.193333;
  160.                 var ggg = gg;
  161.                 if (rr >= ggg  && rr >= bbb ) {
  162.             
  163.                   rr = Math.round((ggg + bbb) / (2 * 0.513333));
  164.                   if (rr > 255) {
  165.                     rr = 255;
  166.                   } else if (rr < 0) {
  167.                     rr = 0;
  168.                   }
  169.                   bmd.setPixel(i, j, rr << 16 | gg << 8 | bb);
  170.                 }
  171.               }
  172.             }
  173.       bmd.unlock()
  174.     }
  175.     
  176.     //魔棒工具
  177.     public static function ShapeSelection(bmd:BitmapData,point:Point) {
  178.       
  179.               var pix = bmd.getPixel(point.x, point.y);
  180.               var rr = pix >>> 16 & 255;
  181.               var gg = pix >>> 8 & 255;
  182.               var bb = pix & 255;
  183.               var rc=10
  184.               var total:Array=[];
  185.               var testArr:Array=[point];
  186.               var pushArr:Array = [];
  187.         var rememberArr:Array=[]
  188.              
  189.         while (testArr.length>0) {
  190.                 for ( i=0; i<testArr.length; i++) {
  191.                   var pt=testArr[i];
  192.                   var rightPoint:Point=new Point(pt.x+1,pt.y);
  193.                    var downPoint:Point=new Point(pt.x,pt.y+1);
  194.                   var leftPoint:Point=new Point(pt.x-1,pt.y);
  195.                    var upPoint:Point=new Point(pt.x,pt.y+1);
  196.                   checkPoint(rightPoint);
  197.                    checkPoint(downPoint);
  198.                   checkPoint(leftPoint);
  199.                  checkPoint(upPoint);
  200.                   }
  201.           
  202.            total = total.concat(testArr);
  203.            rememberArr=testArr
  204.                  testArr=defoam(pushArr);
  205.                  pushArr=[];
  206.                 }
  207.         
  208.         for (i=0; i<total.length; i++) {
  209.                    pt=total[i];
  210.                    bmd.setPixel(pt.x,pt.y,0xffffff);
  211.                     }
  212.         
  213.           //实现羽化效果
  214.         var bbb:BitmapData=new BitmapData(bmd.width,bmd.height);
  215.             var mmm:Bitmap=new Bitmap(bbb);
  216.             addChild(mmm);
  217.             mmm.x=bm.x;
  218.             mmm.y=bm.y;
  219.             mmm.smoothing=true;
  220.             bm.smoothing=true
  221.             for (var ii=0; ii<bbb.width; ii++) {
  222.               for (var jj=0; jj<bbb.height; jj++) {
  223.                bbb.setPixel32(ii,jj,0x00ffffff);
  224.               }
  225.             }
  226.             for (i=0; i<total.length; i++) {
  227.               pt=total[i];
  228.               bbb.setPixel32(pt.x,pt.y,0xa0ff0000);
  229.             }
  230.             mmm.filters=[getBitmapFilter()]  
  231.           
  232.       function defoam(arr:Array):Array {
  233.                    var arrCopy:Array=[];
  234.                    while (arr.length>0) {
  235.                      var obj= arr.shift();
  236.                     for (var i = 0; i < arr.length; i++) {
  237.                        var symbol=arr[i];
  238.                       if (obj.x==symbol.x&&obj.y==symbol.y) {
  239.                         arr.splice(i,1);
  240.                         i--;
  241.                        }
  242.                     }
  243.                    arrCopy.push(obj);
  244.                    }
  245.                   arr=arrCopy  ;
  246.                   return arr;
  247.                  }
  248.             
  249.       function checkPoint(pt:Point) {
  250.                   if (pt.x>bmd.width||pt.y>bmd.height||pt.x<0||pt.y<0) {
  251.                       return;
  252.                       }
  253.             
  254.                   for (var i=0; i<rememberArr.length; i++) {
  255.                     var ptp=rememberArr[i];
  256.                     if(ptp.x==pt.x&&ptp.y==pt.y){
  257.                       return;
  258.                    }
  259.                    }
  260.                    var _pix = bmd.getPixel(pt.x, pt.y);
  261.                    var _rr = _pix >>> 16 & 255;
  262.                    var _gg = _pix >>> 8 & 255;
  263.                    var _bb = _pix & 255;
  264.                   if (Math.abs(_rr-rr)<rc&&Math.abs(_gg-gg)<rc&&Math.abs(_bb-bb)<rc) {
  265.                     pushArr.push(pt);
  266.                    }
  267.                 }
  268.         
  269.       function getBitmapFilter():BitmapFilter {
  270.                var color:Number = 0xff0000
  271.                var alpha:Number = 0.8;
  272.                var blurX:Number = 2;
  273.                var blurY:Number = 2;
  274.                var strength:Number = 6;
  275.                var inner:Boolean = false;
  276.                var knockout:Boolean = false;
  277.                var quality:Number = BitmapFilterQuality.HIGH;
  278.                return new GlowFilter(color,alpha,blurX,blurY,strength,quality,inner,knockout);
  279.                 }  
  280.   
  281.       }
  282.     //裁切图片
  283.     public static function cut(bitmapData:BitmapData, rec:Rectangle):BitmapData {
  284.           
  285.           //完全不接触
  286.           if (rec.x + rec.width < 0 ||rec.y + rec.height < 0) {
  287.             return bitmapData;
  288.             }
  289.             
  290.           if (rec.x >bitmapData.width || rec.y >bitmapData.height) {
  291.             return bitmapData;
  292.             }  
  293.             
  294.           //有部分接触
  295.           if (rec.x <  0) {
  296.             rec.width += rec.x
  297.             rec.x=0
  298.             }
  299.             
  300.           if (rec.y <  0) {
  301.             rec.height += rec.y
  302.             rec.y=0
  303.             }  
  304.           
  305.           if (rec.x+rec.width > bitmapData.width) { 
  306.             rec.width=bitmapData.width-rec.x
  307.             }
  308.           
  309.           if (rec.y+rec.height > bitmapData.height) {
  310.             rec.height=bitmapData.height-rec.y
  311.             }
  312.             
  313.           bitmapData.lock(); 
  314.           var tempColor:ByteArray = bitmapData.getPixels(rec); 
  315.           var bmd:BitmapData = new BitmapData(rec.width, rec.height, true, 0x00FFFF); 
  316.           tempColor.position = 0;
  317.           bmd.setPixels(new Rectangle(0, 0, rec.width, rec.height), tempColor);
  318.           bitmapData.unlock(); 
  319.             return bmd 
  320.       } 
  321.     
  322.     //球面效果
  323.     public static function spherizeFilter(source:BitmapData,midx:Number,midy:Number) {
  324.       //var midx=int(source.width/2);
  325.       //var midy=int(source.height/2);
  326.       var maxmidxy=Math.max(midx,midy)
  327.       var radian,radius,offsetX,offsetY,color,r,g,b;
  328.       var bmd=source.clone();
  329.       for (var i=0; i<source.height-1; i++) {
  330.         for (var j=0; j<source.width-1; j++) {
  331.           offsetX=j-midx;
  332.           offsetY=i-midy;
  333.           radian=Math.atan2(offsetY,offsetX);
  334.           radius=(offsetX*offsetX+offsetY*offsetY)/maxmidxy;
  335.           var x=int(radius*Math.cos(radian))+midx;
  336.           var y=int(radius*Math.sin(radian))+midy;
  337.           if (x<0) {
  338.             x=0;
  339.           }
  340.           if (x>=source.width) {
  341.             x=source.width-1;
  342.           }
  343.           if (y<0) {
  344.             y=0;
  345.           }
  346.           if (y>=source.height) {
  347.             y=source.height-1;
  348.           }
  349.           color=source.getPixel(x, y);
  350.           r = (color & 0xff0000) >> 16;
  351.           g = (color & 0x00ff00) >> 8;
  352.           b = color & 0x0000ff;
  353.           bmd.setPixel(j,i,r*65536+g*256+b);
  354.         }
  355.       }
  356.       return bmd;
  357.     }
  358.         
  359.     //限定参数val的取值范围为-100--100之间
  360.     private static function limitPara(val:Number):Number {
  361.       val = Math.min(val, 100)
  362.       val = Math.max(val,-100)
  363.       return val
  364.     }
  365.   
  366.   }
  367.   
  368. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值