copyChannel()で一発コピー可能でした^^;forked from: 画像をRGBに抽出分解

by undo forked from 画像をRGBに抽出分解 (diff: 12)
♥10 | Line 73 | Modified 2009-11-06 19:59:41 | MIT License
play

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>

Forked