画像をRGBに抽出分解

by undo
♥2 | Line 82 | Modified 2009-11-06 19:22:30 | 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/fsuA
 */

<?xml version = "1.0" encoding = "utf-8"?>
<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);
	var greenbmd:BitmapData = new BitmapData(bmd.width,bmd.height);
	var bluebmd:BitmapData = new BitmapData(bmd.width,bmd.height);
	
	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);
		}
	}
	
	//終わったら、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