package { import fl.controls.Button; import fl.controls.NumericStepper; import flash.events.*; import flash.media.*; import flash.geom.Point; import flash.utils.*; import flash.display.*; import flash.filters.*; public class ColorPicker extends Sprite { private var cam:Camera; // カメラ private var video:Video; // カメラからの画像を表示 private var bmp:Bitmap; // 表示 private var bmd:BitmapData; // 中身のデータ private var labels:BitmapData; // bmdと同サイズのラベル private var color:int = 0x00ffffff; // 選択する色(白) private var _numericStepperLabelNum:NumericStepper; private var _buttonSnapshot:Button; /* IDEが生成したオブジェクトを関連づけ */ public function link_ide_obj() { this._numericStepperLabelNum = numericStepperLabelNum; this._buttonSnapshot = buttonSnapshot; } public function ColorPicker() { stage.scaleMode = StageScaleMode.EXACT_FIT; // 伸縮する //stage.scaleMode = StageScaleMode.NO_SCALE; // 伸縮しない stage.align = StageAlign.TOP_LEFT; // 左上から link_ide_obj(); // IDEが生成したオブジェクトを関連づけ cam = Camera.getCamera(); cam.setMode(800,600,24,true);// 24FPS cam.setQuality(0,100); video = new Video(200,150); // bitmap計算用の小さいビデオ video.attachCamera(cam); this.addChild(video); // videoを表示 _buttonSnapshot.addEventListener(MouseEvent.CLICK, snapShot); // 撮影の関数登録 bmd = new BitmapData(video.width, video.height); bmp = new Bitmap(bmd); // BitmapDataをBitampに登録 this.addChild(bmp); // Bitmapを表示 bmp.x = video.width + 10; // ラベル番号の選択GUI _numericStepperLabelNum.enabled = false; _numericStepperLabelNum.addEventListener(Event.CHANGE, function() { showSelectedLabel(_numericStepperLabelNum.value); } ); } /* 撮影 */ public function snapShot(e:Event){ bmd.draw(video); // カメラから制止画をキャプチャ labeling(); showSelectedLabel(_numericStepperLabelNum.value); _numericStepperLabelNum.enabled = true; } /* 4近傍ラベリング処理 */ public function labeling(){ labels = new BitmapData(bmd.width, bmd.height, false, 0); // transparent = false var label:int = 0; var x:int, y:int; bmd.lock(); // 表示の更新を止める。これやらないとえらい事になる for (y = 0; y < bmd.height; y++) { for (x = 0; x < bmd.width; x++) { if(bmd.getPixel(x,y) == color){ // 選択した色の時(今回は白) if (x > 0 && labels.getPixel(x - 1, y) > 0) { // 左チェック labels.setPixel(x, y, labels.getPixel(x - 1, y)); // ラベルをコピー } else if (x > 0 && y > 0 && labels.getPixel(x - 1, y - 1) > 0) { // 左上 labels.setPixel(x, y, labels.getPixel(x - 1, y - 1)); } else if (y > 0 && labels.getPixel(x, y - 1) > 0) { // 上 labels.setPixel(x, y, labels.getPixel(x, y - 1)); } else if (y > 0 && x < labels.width && labels.getPixel(x + 1, y - 1) > 0) { // 右上 labels.setPixel(x, y, labels.getPixel(x + 1, y - 1)); } else { // 4方向いずれも隣接していない時 labels.setPixel(x, y,++label); // 新しいラベル } } //else { // labels.setPixel(x, y, 0); // ラベル無し //} } } bmd.unlock(); // 表示を更新する _numericStepperLabelNum.maximum = label; _numericStepperLabelNum.minimum = 1; _numericStepperLabelNum.value = 1; } /* 選択したラベルの箇所を青く塗る。他は赤くする */ public function showSelectedLabel(labelNum:int) { bmd.lock(); var x:int, y:int; for (y = 0; y < bmd.height; y++){ for (x = 0; x < bmd.width; x++) { var currentLabel:int = labels.getPixel(x, y); if (currentLabel == labelNum) { bmd.setPixel(x, y, 0x000000FF); // 青 } else if (currentLabel > 0) { bmd.setPixel(x, y, 0x00FF0000); // 赤 } } } bmd.unlock(); } } }