copyChannel()で一発コピー可能でした^^;forked from: 画像をRGBに抽出分解
forked from 画像をRGBに抽出分解 (diff: 12)
ActionScript3 source code
/**
* Copyright undo ( http://wonderfl.net/user/undo )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/3cCi
*/
<?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>
