/*
趣旨:
動いた箇所にだけ置き換えフィルター効果が現れるというサンプルです
*/
package {
import flash.display.MovieClip;
import flash.filters.BlurFilter;
import flash.filters.DisplacementMapFilter;
import flash.filters.DisplacementMapFilterMode;
import flash.media.Video;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.media.Camera;
import flash.events.Event;
import flash.geom.Rectangle;
import flash.geom.Point;
import flash.display.BitmapDataChannel;
import flash.display.BlendMode;
public class Main extends MovieClip {
public var video:Video;//ライブビデオ用クラス
public var bm:Bitmap;//フィルターを表示するビットマップ
public var bmd:BitmapData;
public var now:BitmapData;//時差による動体検知用BMP(現在用)
public var before:BitmapData;//時差による動体検知用BMP(過去用)
public var filterView:BitmapData;//置き換えフィルター用
public var rect:Rectangle;//フィルター用矩形
public var pt:Point;//フィルター用起点
public var cameraW:Number;
public var cameraH:Number;
//ブラーフィルタ
public var filter:BlurFilter = new BlurFilter(80,80);
//置き換えフィルター用変数
public var displacementMap:DisplacementMapFilter;
public var mapPoint:Point = new Point(0, 0);
public var channels:uint = BitmapDataChannel.RED;
public var componentX:uint = channels;
public var componentY:uint = channels;
public var sX:Number = 80;
public var sY:Number = 80;
public var filterMode:String = DisplacementMapFilterMode.CLAMP;
public var color:uint = 0;
public var fileterAlpha:Number = 0;
public var filterRect:Rectangle;
public function Main() {
stage.frameRate = 12;
// カメラ作成
var camera:Camera = Camera.getCamera();
if (camera != null) {
cameraW=camera.width*3;
cameraH=camera.height*3;
video = new Video(cameraW, cameraH);
video.attachCamera(camera);
//addChild(video);
} else {
trace("カメラがつながってないよ");
}
//実際にフィルター効果を表示するためのビットマップ
bmd = new BitmapData(cameraW, cameraH,true);
bm = new Bitmap(bmd);
//bm.alpha=0.4;
addChild(bm);
//時差を利用した動体検知用に2種類のビットマップデータを作成
now = new BitmapData(cameraW, cameraH);
before = new BitmapData(cameraW, cameraH);
filterView = new BitmapData(cameraW, cameraH);
filterRect=new Rectangle(0,0,cameraW,cameraH);
//フィルター用にレクトとポイント設定
rect = new Rectangle(0, 0, cameraW, cameraH);
pt = new Point(0, 0);
stage.addEventListener(Event.ENTER_FRAME,drawVideo);
}
//エンターフレームでフィルター効果を再描画し続けます
public function drawVideo(e:Event) {
filterView.draw(video);//ビデオを単純に描画
now.copyPixels(filterView,filterRect,pt);//現在のビデオを取得描画(コピーの方が早い?)
now.draw(before, null, null, BlendMode.DIFFERENCE);//ブレンドモードDIFFERENCEで動いた箇所をチェック
now.threshold(now, rect, pt, ">", 0xff111111, 0xffffffff);//しきい値で色を2階調化
before.copyPixels(filterView,filterRect,pt);//次のブレンド用にビフォーを記録
now.applyFilter(now,rect,pt,filter);//ナウの2階調画像にフィルター効果
displacementMap=new DisplacementMapFilter(now,mapPoint,componentX,componentY,sX,sY,filterMode,color,fileterAlpha);
filterView.applyFilter(filterView, filterRect, pt, displacementMap);//自身に置き換えフィルター効果
bmd.copyPixels(filterView,filterRect,pt);//表示
}
}
}