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

by Takayuki.Yamazaki forked from copyChannel()で一発コピー可能でした^^;forked from: 画像をRGBに抽出分解 (diff: 1)
♥0 | Line 74 | Modified 2011-09-18 11:05:19 | MIT License
play

ActionScript3 source code

/**
 * Copyright Takayuki.Yamazaki ( http://wonderfl.net/user/Takayuki.Yamazaki )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/5SFV
 */

<?xml version = "1.0" encoding = "utf-8"?>
<!-- forked from undo's copyChannel()で一発コピー可能でした^^;forked from: 画像をRGBに抽出分解 -->
<!-- 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>