/* * カメラ画像を取得して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; } } } カメラ映像を分解したり戻したり