flash on 2010-12-29

by keno42
私用プログラム 画像の明るさと彩度、色相を表示
♥0 | Line 181 | Modified 2010-12-29 11:56:33 | MIT License
play

ActionScript3 source code

/**
 * Copyright keno42 ( http://wonderfl.net/user/keno42 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/3aRd
 */

// 私用プログラム 画像の明るさと彩度、色相を表示

package {
    import flash.display.*;
    import flash.text.*;
    import flash.events.*;
    import flash.ui.*;
    import flash.net.*;
    import flash.utils.*;
    public class FlashTest extends Sprite {
        private var label_url:TextField = new TextField();
        private var input:TextField = new TextField();
        private var guide:TextField = new TextField();
        private var loader:Loader;
        private var bmp:Bitmap = new Bitmap();
        private var graph:Sprite = new Sprite();
        
        public function FlashTest() {
            // write as3 code here..
            
            // place texts
            label_url.text = "Image URL";
            label_url.autoSize = "left";
            addChild(label_url);
            input.border = true;
            input.type = "input";
            addChild(input);
            input.height = 20;
            input.x = label_url.textWidth + 5;
            input.width = 465 - 5 - input.x;
            input.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
            guide.autoSize = "left";
            guide.y = label_url.y + 25;
            setGuideText(0);
            addChild(guide);
            addChild(bmp);
            bmp.y = guide.y + 25;
            addChild(graph);
            graph.x = 5;
            graph.y = bmp.y + 5;
        }
        private function setGuideText(type:int):void{
            var str:String;
            switch(type){
                case 0: str = "input image's url and hit enter";
                    break;
                case 1: str = "loading...";
                    break;
                case 2: str = "load complete. analyzing...";
                    break;
                case 3: str = "load failed. input correct url again.";
                    break;
                case 4: str = "analysis finished. you can input another image url";
                    break;
            }
            guide.text = str;
        }
        private function onKeyDown(e:KeyboardEvent):void{
            if(e.keyCode == Keyboard.ENTER){
                if( loader == null){
                    loader = new Loader();
                    loader.load(new URLRequest(input.text));
                    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete, false, 0, true);
                    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIoError, false, 0, true);
                    setGuideText(1);
                }
            }
        }
        private function onComplete(e:Event):void{
            var temp:ByteArray = loader.contentLoaderInfo.bytes;
            loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete2, false, 0, true);
            loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIoError, false, 0, true);
            loader.loadBytes(temp);
        }
        private function onComplete2(e:Event):void{
            setGuideText(2);
            var bmpData:BitmapData = new BitmapData(loader.width, loader.height, true, 0x0);
            bmpData.draw(loader.content);
            bmp.bitmapData = bmpData;
            analyze(bmpData);
        }
        private function onIoError(e:Event):void{
            setGuideText(3);
            loader = null;
        }
        private function analyze(bmp:BitmapData):void{
            var temp:ByteArray = bmp.getPixels(bmp.rect);
            var v:Array = new Array(256); // it's different from v of hsv, but brightness of grayscale
            var s:Array = new Array(256);
            var h:Array = new Array(360);
            var i:int;
            var maxH:int;
            for( i = 0; i < 256; i++){
                v[i] = s[i] = h[i] = 0;
            }
            for( ; i < 360; i++ ){
                h[i] = 0;
            }
            for( i = 0; i < temp.length; i+=4 ){
                var tempV:int = (151 * temp[i+1] + 78 * temp[i+2] + 27 * temp[i+3]) >> 8;
                v[tempV]++;
                var max:int = (temp[i+1]>temp[i+2])?temp[i+1]:temp[i+2];
                max = (max>temp[i+3])?max:temp[i+3];
                var min:int = (temp[i+1]<temp[i+2])?temp[i+1]:temp[i+2];
                min = (min<temp[i+3])?min:temp[i+3];
                var tempS:int = max - min;
                s[tempS]++;
                var tempH:int;
                if( tempS != 0 ){
                    if( max == temp[i+1] ){
                        tempH = 60 * (temp[i+2] - temp[i+3]) / tempS;
                    } else if ( max == temp[i+2] ){
                        tempH = 120 + 60 * (temp[i+3] - temp[i+1]) / tempS;
                    } else {
                        tempH = 240 + 60 * (temp[i+1] - temp[i+2]) / tempS;
                    }
                    if ( tempH < 0 ) tempH += 360;
                    h[tempH]++;
                    maxH = (maxH>h[tempH])?maxH:h[tempH];
                }
            }
            var pixelNum:Number = temp.length / 4;
            var a:Number = 256 / pixelNum;
            var st:Number = 0;
            graph.graphics.clear();
            graph.graphics.beginFill(0xFFFFFF, 0.5);
            graph.graphics.lineStyle(0, 0x0);
            graph.graphics.drawRect(-1, -1, 258, 258);
            graph.graphics.drawRect(-1, 263, 361, 101);
            graph.graphics.endFill();
            graph.graphics.lineStyle(0, 0x888888);
            graph.graphics.moveTo(1, 128);
            graph.graphics.lineTo(255, 128);
            graph.graphics.moveTo(128, 1);
            graph.graphics.lineTo(128, 255);
            for( i = 60; i <= 300; i+= 60 ){
                graph.graphics.moveTo(i, 264);
                graph.graphics.lineTo(i, 363);
            }
            
            // brightness
            graph.graphics.lineStyle(0, 0x0);
            graph.graphics.moveTo(0, 256);
            for( i = 0; i < 256; i++){
                graph.graphics.lineStyle(0, i * 0x10101);
                st += v[i];
                graph.graphics.lineTo(i,256 - Math.floor(a * st));
            }
            
            // saturation
            st = 0;
            graph.graphics.lineStyle(0, 0x000000);
            graph.graphics.moveTo(0, 256);
            for( i = 0; i < 256; i++){
                graph.graphics.lineStyle(0, i << 16);
                st += s[i];
                graph.graphics.lineTo(i,256 - Math.floor(a * st));
            }
            // hue
            a = 100 / maxH;
            graph.graphics.lineStyle(0,0,0);
            for( i = 0; i < 60; i++ ){
                graph.graphics.beginFill(0xFF0000 | (int(0xFF * i/60)<<8));
                graph.graphics.drawRect(i, 364, 1, - a * h[i]);
            }
            for( ; i < 120; i++ ){
                graph.graphics.beginFill(0x00FF00 | (int(0xFF * (120-i)/60)<<16));
                graph.graphics.drawRect(i, 364, 1, - a * h[i]);
            }
            for( ; i < 180; i++ ){
                graph.graphics.beginFill(0x00FF00 | (int(0xFF * (i-120)/60)<<0));
                graph.graphics.drawRect(i, 364, 1, - a * h[i]);
            }
            for( ; i < 240; i++ ){
                graph.graphics.beginFill(0x0000FF | (int(0xFF * (240-i)/60)<<8));
                graph.graphics.drawRect(i, 364, 1, - a * h[i]);
            }
            for( ; i < 300; i++ ){
                graph.graphics.beginFill(0x0000FF | (int(0xFF * (i-240)/60)<<16));
                graph.graphics.drawRect(i, 364, 1, - a * h[i]);
            }
            for( ; i < 360; i++ ){
                graph.graphics.beginFill(0xFF0000 | (int(0xFF * (360-i)/60)<<0));
                graph.graphics.drawRect(i, 364, 1, - a * h[i]);
            }
            graph.graphics.endFill();
            loader = null;
            setGuideText(4);
            
        }
    }
}