In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

[1日1Wonderfl]7日目: FlyHigh

1日1Wonderfl 7/30日目
Bitmap なんかの色分解をどうやったら出来るのかやってみたよ。
*  画像はチンカスの人のを拝借しちゃいました。カッコ良いよね :-D
*
*  @see http://www.flickr.com/photos/b7ue/3453477278/
*  @see http://wonderfl.kayac.com/code/381f195b4aad8c2a14fc00ad03f638df25568a5d
*  @see http://wonderfl.kayac.com/code/54ceedfdf45f70cf2aefac5dc6d2c11793b71053
// 1日1Wonderfl 7/30日目
/**
 *  Bitmap なんかの色分解をどうやったら出来るのかやってみたよ。
 *  画像はチンカスの人のを拝借しちゃいました。カッコ良いよね :-D
 *
 *  @see http://www.flickr.com/photos/b7ue/3453477278/
 *  @see http://wonderfl.kayac.com/code/381f195b4aad8c2a14fc00ad03f638df25568a5d
 *  @see http://wonderfl.kayac.com/code/54ceedfdf45f70cf2aefac5dc6d2c11793b71053
 */
package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BitmapDataChannel;
    import flash.display.BlendMode;
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageQuality;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.SecurityErrorEvent;
    import flash.geom.ColorTransform;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.net.URLRequest;
    import flash.system.LoaderContext;

    import com.flashdynamix.utils.SWFProfiler;

    import frocessing.color.ColorHSV;
    import frocessing.color.ColorRGB;

    import org.libspark.betweenas3.BetweenAS3;
    import org.libspark.betweenas3.easing.*;

    [SWF(width=465, height=465, frameRate=30, backgroundColor=0x000000)]

    public class Main extends Sprite
    {
        public static const NUM_SEPARATORS:uint = 15;
        public static const IMAGE_URL:String = 'http://farm6.static.flickr.com/5247/5320918548_80c681d212.jpg';

        public function Main()
        {
            addEventListener(Event.ADDED_TO_STAGE, initialize);
        }

        private function initialize(evt:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, initialize);

            stage.align = StageAlign.TOP_LEFT;
            stage.quality = StageQuality.HIGH;
            stage.scaleMode = StageScaleMode.NO_SCALE;

            SWFProfiler.init(this);

            var req:URLRequest,
                ctx:LoaderContext,
                loader:Loader;

            req = new URLRequest(IMAGE_URL);
            ctx = new LoaderContext(true);
            loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);

            loader.load(req, ctx);
        }

        private function loadComplete(evt:Event):void
        {
            var i:uint,
                rs:uint, gs:uint, bs:uint,
                ds:int, dx:int, dy:int,
                sx:Number, sy:Number,
                ex:Number, ey:Number,
                cAngle:Number, nAngle:Number, length:uint,
                rect:Rectangle,
                info:LoaderInfo,
                original:BitmapData,
                destination:BitmapData,
                bm:Bitmap, sp:Sprite,
                rgb:ColorRGB,
                rgbList:Vector.<ColorRGB>;

            info = LoaderInfo(evt.target);
            original = Bitmap(info.content).bitmapData;

            ds = Math.min(original.width, original.height) >> 0;
            dx = (original.width - ds) >> 1;
            dy = (original.height - ds) >> 1;

            rect = new Rectangle(dx, dy, ds, ds);

            rs = gs = bs = 0;
            rgbList = new Vector.<ColorRGB>(NUM_SEPARATORS, true);
            for (i=0; i<NUM_SEPARATORS; i++)
            {
                rgb = new ColorHSV(360 * i / NUM_SEPARATORS, 1, 1).toRGB();
                rs += rgb.r;
                gs += rgb.g;
                bs += rgb.b;

                rgbList[i] = rgb;
            }

            cAngle = 0;
            nAngle = Math.PI * 2 / NUM_SEPARATORS;
            length = 500;
            ex = stage.stageWidth >> 1;
            ey = stage.stageHeight >> 1;
            for (i=0; i<NUM_SEPARATORS; i++)
            {
                rgb = rgbList[i];
                sx = ex + Math.cos(cAngle) * length;
                sy = ey + Math.sin(cAngle) * length;

                destination = new BitmapData(ds, ds, true, 0);
                destination.copyPixels(original, rect, new Point());
                destination.colorTransform(destination.rect, new ColorTransform(rgb.r/rs, rgb.g/gs, rgb.b/bs, 1, 0, 0, 0, 0));

                bm = new Bitmap(destination);
                bm.x -= bm.width >> 1;
                bm.y -= bm.height >> 1;

                sp = new Sprite();
                sp.addChild(bm);
                sp.blendMode = BlendMode.ADD;

                BetweenAS3.serial(
                    BetweenAS3.tween(sp, {x: ex, y: ey}, {x: sx, y: sy}, 3, Expo.easeOut),
                    BetweenAS3.tween(sp, {x: sx, y: sy}, {x: ex, y: ey}, 2, Expo.easeIn)
                ).play();

                addChild(sp);

                cAngle += nAngle;
            }

            original.dispose();
            info.loader.unload();
        }
    }
}