package { import flash.display.Sprite; import flash.display.BitmapData; import flash.display.Bitmap; import flash.events.Event; import flash.media.SoundMixer; import flash.geom.Point; import flash.filters.BlurFilter; import flash.filters.ColorMatrixFilter; import flash.filters.DisplacementMapFilter; import flash.utils.ByteArray; import flash.geom.Matrix; import flash.geom.ColorTransform; import flash.display.GradientType; import flash.display.BlendMode; public class FiltersEffect extends Sprite { var bitmapData:BitmapData; var cloneBD:BitmapData; var bitmap:Bitmap; var sprite:Sprite; var byteArray:ByteArray; var thisW:Number; var thisH:Number; var float:Number; var matrix:Matrix; var _matrix:Matrix; private var h:Number = 0; private var s:Number = 1; private var v:Number = 1; var i:int = 0; public function FiltersEffect(w:Number=550,h:Number=400,isBack:Boolean=true) { thisW = w; thisH = h; init(); if (isBack) { this.blendMode = BlendMode.SCREEN; } } function init():void { sprite=new Sprite(); byteArray=new ByteArray(); cloneBD = new BitmapData(thisW,thisH,false,0); bitmapData = new BitmapData(thisW,thisH,false,0); bitmap = addChild(new Bitmap(bitmapData)) as Bitmap; this.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler); } private function onEnterFrameHandler(event:Event):void { //h s v var color:uint = HSVtoRGB(h,s,v); h += 1; bitmapData.lock(); drawSprite(false); //applyDisplace(bitmapData); //matrixEffect() //matrixEffectA(); //matrixEffectB() matrixEffectC() // bitmapData.applyFilter(bitmapData,bitmapData.rect,new Point(),new ColorMatrixFilter([1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0.95,0])); //bitmapData.applyFilter(bitmapData,bitmapData.rect, new Point(), new BlurFilter(8,8,2)); //bitmapData.applyFilter(bitmapData,bitmapData.rect,new Point(),new BlurFilter(6,5,9)); //bitmapData.draw(_sprite,null,null,"add"); bitmapData.unlock(); } private function applyDisplace(bitmapData:BitmapData):void { cloneBD = bitmapData.clone(); var _bd:DisplacementMapFilter = new DisplacementMapFilter(cloneBD,new Point(0,0),1,2,10,10,"clamp"); bitmapData.applyFilter(cloneBD, bitmapData.rect, new Point(0,0), _bd); bitmapData.applyFilter(bitmapData,bitmapData.rect, new Point(), new BlurFilter(8,8,2)); bitmapData.draw(sprite); } function matrixEffect():void { matrix = new Matrix(1,0,0,1,0,0); bitmapData.draw(sprite,matrix); bitmapData.applyFilter(bitmapData,bitmapData.rect,new Point(),new ColorMatrixFilter([1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0.80,0])); bitmapData.applyFilter(bitmapData,bitmapData.rect, new Point(), new BlurFilter(2,2,0)); } function matrixEffectA():void { matrix = new Matrix(); matrix.a = (thisW + thisW / 40) / thisW; matrix.d = (thisH + thisH / 80) / thisH; matrix.tx = - thisW / 80; matrix.ty = - thisH / 240; _matrix = new Matrix(1,0,0,1,(thisW - thisW * 0.7) / 2,(thisH - thisH * 0.7) / 2); _matrix.scale(0.7, 0.7); cloneBD = bitmapData.clone(); bitmapData.draw(cloneBD, matrix, new ColorTransform(0.91,0.92,0.95), null, null, true); bitmapData.draw(sprite, _matrix, null, null, null, true); bitmapData.applyFilter(bitmapData, bitmapData.rect, new Point(), new BlurFilter(0,0,1)); } function matrixEffectB():void { matrix=new Matrix(); matrix.translate( - thisW/2, - thisH/2); matrix.scale(1.14,1.01); matrix.translate(thisW/2,thisH/2); bitmapData.draw(bitmapData,matrix,new ColorTransform(0.92,0.92,0.92)); bitmapData.applyFilter(bitmapData,bitmapData.rect,new Point(),new ColorMatrixFilter([1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0])); bitmapData.applyFilter(bitmapData, bitmapData.rect, new Point(), new BlurFilter(8, 8,2)); bitmapData.draw(sprite, null, null, "add"); } function matrixEffectC():void { matrix=new Matrix(); matrix.translate( - thisW/2, - thisH/2); matrix.scale(1.1,1.1); matrix.translate(thisW/2,thisH/2); bitmapData.draw(bitmapData,matrix,new ColorTransform(0.96,0.96,0.96)); bitmapData.applyFilter(bitmapData,bitmapData.rect,new Point(0,0),new BlurFilter(4,4,1)); bitmapData.draw(sprite); } function drawSprite(value:Boolean=true):void { SoundMixer.computeSpectrum(byteArray,value); //float = byteArray.readFloat(); /*var colors:Array = new Array(0x00ff00,0x00ffff,0xffff00,0xff00ff); var alphas:Array = new Array(1,1,1,1); var ratios:Array = new Array(0,80,160,255); var matrix:Matrix = new Matrix(); matrix.createGradientBox(thisW, thisH, 0, 0, 0); sprite.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, matrix); */ sprite.graphics.clear(); sprite.graphics.lineStyle(0,0xff9900,1); var n:Number = thisW / 256; sprite.graphics.moveTo(0,thisH/2); for (i=0; i <256; i++) { float = byteArray.readFloat() / 2; if (i>0) { sprite.graphics.lineTo(i*n, thisH/2 - float*thisH/4); } } sprite.graphics.lineStyle(0,0xff00ff,1); sprite.graphics.moveTo(thisW, thisH/4*3); for (i =256; i > 0; i--) { float = byteArray.readFloat() / 2; sprite.graphics.lineTo(i*n,thisH/4*3 - float*thisH/4); } } private function HSVtoRGB(h:Number, s:Number, v:Number):uint { var r:Number = 0,g:Number = 0,b:Number = 0; var i:Number,x:Number,y:Number,z:Number; if (s < 0) { s = 0; } if (s > 1) { s = 1; } if (v < 0) { v = 0; } if (v > 1) { v = 1; } h = h % 360; if (h < 0) { h += 360; } h /= 60; i = h >> 0; x = v * (1 - s); y = v * (1 - s * (h - i)); z = v * (1 - s * (1 - h + i)); switch (i) { case 0 : r = v; g = z; b = x; break; case 1 : r = y; g = v; b = x; break; case 2 : r = x; g = v; b = z; break; case 3 : r = x; g = y; b = v; break; case 4 : r = z; g = x; b = v; break; case 5 : r = v; g = x; b = y; break; } var c:uint; c = (r * 255 >> 0) << 16 | (g * 255 >> 0) << 8 | (b * 255 >> 0); return c; } } }