<?xml version = "1.0" encoding = "utf-8"?> <!-- forked from undo's 画像をRGBに抽出分解 --> <mx:Application xmlns:mx = "http://www.adobe.com/2006/mxml" layout = "absolute" applicationComplete = "init();"> <mx:Script> <![CDATA[ private var source:Loader; private var red:Bitmap = new Bitmap(); private var green:Bitmap = new Bitmap(); private var blue:Bitmap = new Bitmap(); private var fr:FileReference = new FileReference(); private function init():void { source = new Loader(); source.contentLoaderInfo.addEventListener(Event.COMPLETE, onSourceLoadComp); //ここでロードしてもCompleteイベント出してくれないのはなぜ? //var defImgSrc:URLRequest = new URLRequest("http://wonderfl.net/static/tmp/related_images/画像URLs"); //source.load(defImgSrc); this.image.addChild(source); this.image.addChild(red); this.image.addChild(green); this.image.addChild(blue); green.x = blue.x = this.width/2; } private function onSourceLoadComp(evt:Event):void { trace("onSourceComp"); var bm:Bitmap = source.content as Bitmap; //RGBに分解して描画 drawRGB(bm.bitmapData); //サイズを調整 reScale(); } //参照ボタンを押した private function onBrowseBtnClick():void { //画像ファイルを参照 this.fr.addEventListener(Event.SELECT, onFileSelect); this.fr.browse([new FileFilter("Image", "*.jpg;*.gif;*.png")]); } private function onFileSelect(evt:Event):void { this.fr.removeEventListener(Event.SELECT, onFileSelect); this.fr.addEventListener(Event.COMPLETE, onFileComplete); this.fr.load(); } private function onFileComplete(evt:Event):void { //画像をsource:Loaderでロード this.fr.removeEventListener(Event.COMPLETE, onFileComplete); this.source.loadBytes(this.fr.data); //イベントはinit();内で定義済み } private function drawRGB(bmd:BitmapData):void { var rgb:uint; var r:uint; var g:uint; var b:uint; var redbmd:BitmapData = new BitmapData(bmd.width,bmd.height,true,0xff000000); var greenbmd:BitmapData = new BitmapData(bmd.width,bmd.height,true,0xff000000); var bluebmd:BitmapData = new BitmapData(bmd.width,bmd.height,true,0xff000000); /* for(var i:int = 0; i < bmd.width; i++) { for(var j:int = 0; j < bmd.height; j++) { //pixごとの色情報を取得します rgb = bmd.getPixel(i,j); //色情報をr,g,bに分解します r = rgb >> 16 & 0xff; g = rgb >> 8 & 0xff; b = rgb & 0xff; //各BitmapDataにsetPixel redbmd.setPixel(i,j,r << 16); greenbmd.setPixel(i,j,g << 8); bluebmd.setPixel(i,j,b); } } */ //BitmapData.copyChannel()を使えば一発コピー。 //thx @uwitenpen 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); //終わったら、Bitmapに渡します red.bitmapData = redbmd; green.bitmapData = greenbmd; blue.bitmapData = bluebmd; } private function reScale():void { var maxW:Number = this.width / 2; var maxH:Number = this.height / 2; var newScale:Number = Math.min(maxW / source.content.width, maxH / source.content.height); source.scaleX = source.scaleY = red.scaleX = red.scaleY = green.scaleX = green.scaleY = blue.scaleX = blue.scaleY = newScale; source.x = red.x = maxW - source.width; red.y = green.y = source.height; } ]]> </mx:Script> <mx:Image id="image"/> <mx:Button id = "browseBtn" label = "参照" x="10" y="10" click = "onBrowseBtnClick();" /> </mx:Application> copyChannel()で一発コピー可能でした^^;forked from: 画像をRGBに抽出分解