BlurTest.as (メインクラス)
package {
    import flash.display.Sprite;
    import flash.filters.BitmapFilter;
    import flash.filters.BlurFilter;
    import flash.filters.BitmapFilterQuality;
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.geom.Matrix;
    import flash.geom.ColorTransform;
    import flash.events.Event;
    import flash.events.MouseEvent;

    [SWF(width="550", height="440", backgroundColor="0x0", frameRate="20")]

    public class BlurTest extends Sprite{
        [(source="test.jpg")]
        private var IMG:Class;
        
        //for the original image
        private var origBitmap:BitmapData;
        private var img:Bitmap;
        private var imgWidth:Number;
        private var imgHeight:Number;
        
        //filter variables
        private var t:int = 0;
        private var blurX:int;
        private var blurY:int;
        
        //filtered window size suitable for the image
        private static const FILTER_WIDTH:int = 75;
        private static const FILTER_HEIGHT:int = 185;
        
        //draggable base for the filter
        private var base:Sprite;
        
        public function BlurTest(){
            init();
            addEventListener(Event.ENTER_FRAME,onEnterFrame);
        }
        
        private function init():void{
            img = new IMG();
            origBitmap = img.bitmapData;
            imgWidth = origBitmap.width;
            imgHeight = origBitmap.height;
            img.x = stage.stageWidth/2 - imgWidth/2;
            img.y = stage.stageHeight/2 - imgHeight/2;
            addChildAt(img,0);
            
            base = new Sprite();
            //initial position of the filtered window on the image
            const X_INIT:Number = 50;
            const Y_INIT:Number = 70;
            
            base.x = img.x + X_INIT;
            base.y = img.y + Y_INIT;
            addChildAt(base,1);
            addFilter(X_INIT,Y_INIT);
            base.addEventListener(MouseEvent.MOUSE_DOWN, pickUp);
            base.addEventListener(MouseEvent.MOUSE_UP, place);
        }
        
        private function pickUp(e:MouseEvent):void{
            var rect:Rectangle = new Rectangle(img.x,img.y,imgWidth-FILTER_WIDTH,imgHeight-FILTER_HEIGHT);
            e.target.startDrag(false,rect);
        }
        
        private function place(e:MouseEvent):void{
            e.target.stopDrag();
        }
        
        private function onEnterFrame(e:Event):void{
            const OFFSET:Number = 10;
            const AMP:Number = 20;
            t+=10;
            
            if (t > 360){
                t = 0;
            }
        
            blurX = OFFSET + AMP*Math.pow(Math.cos(t*Math.PI/180), 2);
            blurY = OFFSET + AMP*Math.pow(Math.cos(t*Math.PI/180), 2);
            addFilter(base.x-img.x, base.y-img.y);
        }
        
        private function addFilter(x:Number, y:Number):void{
            var pt:Point = new Point(x,y);
            
            var clip:BitmapData = partition(origBitmap, pt.x,pt.y,FILTER_WIDTH,FILTER_HEIGHT);
            var finalBitmap:BitmapData = new BitmapData(clip.width,clip.height,true);
            var filter:BitmapFilter = setBlurFilter();
            finalBitmap.applyFilter(clip,clip.rect,new Point(0,0),filter);
            var imgFilter:Bitmap = new Bitmap(finalBitmap);

            base.addChildAt(imgFilter, 0);
            if (base.numChildren > 1){
                base.removeChildAt(1);
            }
        }
        
        private function partition(oPic:BitmapData, x:Number, y:Number, w:Number, h:Number):BitmapData {
            var clipRect:Rectangle = new Rectangle(0, 0, w, h);
            var clipMatrix:Matrix = new Matrix();
            clipMatrix.translate(-x,-y);
            var clipPic:BitmapData = new BitmapData(w, h);
            clipPic.draw(oPic, clipMatrix, new ColorTransform(), null, clipRect);
            return clipPic;
        }
        
        private function setBlurFilter():BlurFilter{
            return new BlurFilter(blurX,blurY,BitmapFilterQuality.MEDIUM);
        }    
    }
}
Powered by blog Boreal Kiss 2008.