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

カメラ映像を分解したり戻したり

カメラ画像を取得してRGBに分解します。
* 画面をクリックすると分割した画像を1点に重ねます。
* 背景が黒、ブレンドモードがADDなら元画像と同じになるはずです。
* ブレンドモードをいじったりしてみてください。
Get Adobe Flash player
by undo 07 Dec 2010
/**
 * Copyright undo ( http://wonderfl.net/user/undo )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/1eA1
 */

/*
* カメラ画像を取得してRGBに分解します。
* 画面をクリックすると分割した画像を1点に重ねます。
* 背景が黒、ブレンドモードがADDなら元画像と同じになるはずです。
* ブレンドモードをいじったりしてみてください。
*/
package
{
    import caurina.transitions.Tweener;
    
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BlendMode;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.media.Camera;
    import flash.media.Video;
    import flash.system.Security;
    import flash.system.SecurityPanel;
    
    [SWF(backgroundColor = 0x0)]

    public class CameraTests extends Sprite
    {
        public function CameraTests()
        {
            Wonderfl.capture_delay(1);
                stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            this.camWidth = this.stage.stageWidth/2;
            this.camHeight = this.stage.stageHeight/2;
            init();
        }

        private var _cam:Camera;
        private var _vid:Video;
        private var _bmd:BitmapData;

        private var _redBmd:BitmapData;
        private var _greenBmd:BitmapData;
        private var _blueBmd:BitmapData;

        private var _rbm:Bitmap;
        private var _gbm:Bitmap;
        private var _bbm:Bitmap;

        private var camWidth:Number;
        private var camHeight:Number;
        private var camFPS:Number = 15;

        private var bMode:String = BlendMode.ADD;
        private var conved:Boolean = false;
        private function init():void
        {
            Security.allowDomain('*');
            
            _cam = Camera.getCamera();
            if(!_cam) return;
            
            _vid = new Video(camWidth, camHeight);
            _cam.setMode(camWidth, camHeight, camFPS);
            _vid.attachCamera(_cam);
            _bmd = new BitmapData(camWidth, camHeight, false);
            _redBmd = new BitmapData(camWidth, camHeight, false,0);
            _greenBmd = new BitmapData(camWidth, camHeight, false,0);
            _blueBmd = new BitmapData(camWidth, camHeight, false,0);

            _rbm = new Bitmap(_redBmd);
            _gbm = new Bitmap(_greenBmd);
            _bbm = new Bitmap(_blueBmd);
            _rbm.y = _gbm.y = camHeight;
            _bbm.x = _gbm.x = camWidth;
            
            var rsp:Sprite = new Sprite();
            var gsp:Sprite = new Sprite();
            var bsp:Sprite = new Sprite();
            
            rsp.cacheAsBitmap = true;
            gsp.cacheAsBitmap = true;
            bsp.cacheAsBitmap = true;
            
            this.addChild(new Bitmap(_bmd));
            
            this.addChild(_rbm);
            this.addChild(_gbm);
            this.addChild(_bbm);
            
            _rbm.blendMode = bMode;
            _gbm.blendMode = bMode;
            _bbm.blendMode = bMode;

            addEventListener(Event.ENTER_FRAME, onEnter);

            stage.addEventListener(MouseEvent.CLICK, onClick);
        }

        private function onEnter(evt:Event):void
        {
            var matrix:Matrix = new Matrix();
            matrix.scale(-1, 1);
            matrix.translate(camWidth, 0);
            _bmd.draw(_vid, matrix);

            _redBmd.copyChannel(_bmd, _bmd.rect, new Point(), 1, 1);
            _greenBmd.copyChannel(_bmd, _bmd.rect, new Point(), 2, 2);
            _blueBmd.copyChannel(_bmd, _bmd.rect, new Point(), 4, 4);
        }
        private function onClick(evt:MouseEvent):void
        {
            trace(conved);
            Tweener.removeAllTweens();
            if(conved)
            {
                Tweener.addTween(_rbm, {x:0, time:1, transition:"easeInOutCubic"});
                Tweener.addTween(_bbm, {y:0, time:1, transition:"easeInOutCubic"});
                conved = false;
            }
            else
            {
                Tweener.addTween(_rbm, {x: camWidth, time: 1, transition: "easeInOutCubic"});
                Tweener.addTween(_bbm, {y: camHeight, time: 1, transition: "easeInOutCubic"});
                conved = true;
            }
        }


        /*
         * functions
         */
        private function selectCamera():void
        {
            //ダイアログを表示して、ユーザにカメラを選択してもらう
            Security.showSettings(SecurityPanel.CAMERA);
        }

        private function setCamToVideo(c:Camera, v:Video = null):Video
        {
            //Videoへカメラを設定する
            if (!v)
                v = new Video();

            v.attachCamera(c);
            return v;
        }
    }
}