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{
[Embed(source="test.jpg")]
private var IMG:Class;
private var origBitmap:BitmapData;
private var img:Bitmap;
private var imgWidth:Number;
private var imgHeight:Number;
private var t:int = 0;
private var blurX:int;
private var blurY:int;
private static const FILTER_WIDTH:int = 75;
private static const FILTER_HEIGHT:int = 185;
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();
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.