timedisplacement

先日のちょっと前のフレームを表示を利用して、フレームを1ラインずつ描画してみました。
timedisplacementって言うらしいです。

Webカメラで遊ぶと面白いです。
参考にしたページはこちらです。
http://saqoosha.net/lab/timedisplacement/?http://www.youtube.com/watch?v=I2MsDogV4g4

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    creationComplete="init()" viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
import mx.controls.Image;
import mx.controls.VideoDisplay;
private var size:int      = 200;
private var bd:BitmapData = new BitmapData( size , size );
//初期化関数
private function init():void{
    //タイマー作成
    this.addEventListener(Event.ENTER_FRAME , myTimer );
}
//タイマー
private function myTimer( e:Event ):void{
    //とりあえずビデオを毎回bdへ描画
    bd.draw(myFlv);
    //バッファの作成と描画
    myDraw();
}
//バッファの作成と描画関数
private var frame:int          = 0;
private var bd_buf:Array       = new Array();
private var bd_tmp:BitmapData  = new BitmapData( size , size );
private var bd_dest:BitmapData = new BitmapData( size , size );
private function myDraw():void{
    //画像のクローン作成
    bd_tmp = bd.clone();
    //配列に現在の画像を追加
    bd_buf[frame] = bd_tmp;
    //バッファたまった?
    if( frame > size ){
        for( var i:int = 0 ; i < size ; i++ ){
            //バッファから一ラインずつずらしながらbitmapへ描画
            bd_dest.copyPixels( bd_buf[frame - i ] , new Rectangle( 0, i , size , 1 ) , new Point( 0 , i ) );
        }
        myImage.source = new Bitmap( bd_dest );
        //古いバッファを削除
        bd_buf[frame-size] = null;
    }
    frame++;
}
]]>
</mx:Script>
    <mx:Image x="10" y="10" width="200" height="200" id="myImage"/>
    <mx:VideoDisplay x="218" y="10" width="200" height="200" id="myFlv" source="test.flv"/>
</mx:Application>

次は背景を認識して、エセ旅行写真とかやってみたいなぁ。