In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

WebCameraTest

趣旨:
動いた箇所にだけ置き換えフィルター効果が現れるというサンプルです
Get Adobe Flash player
by tonka 18 Dec 2008
    Embed
/*
趣旨:
動いた箇所にだけ置き換えフィルター効果が現れるというサンプルです
*/

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);//表示


		}


	}
}