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

forked from: wonderfl作品をキャプチャしてダウンロード

wonderfl作品のキャプチャ用アプリ
* サイズ指定出来るようにして、壁紙を作れるようにしても面白いかも。
* 
* ※これでキャプチャできない作品も結構あるみたいです。。。
*  原因は何なんだろう。
* ※初期値にはyd_niku様のMikanGridをお借りしました。多謝!
*  http://wonderfl.net/code/b6a4645461857e6f46909aea3787fe8dd30e4830
/**
 * Copyright SoWhat1983 ( http://wonderfl.net/user/SoWhat1983 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/nzQo
 */

// forked from beryu's wonderfl作品をキャプチャしてダウンロード
/* wonderfl作品のキャプチャ用アプリ
 * サイズ指定出来るようにして、壁紙を作れるようにしても面白いかも。
 * 
 * ※これでキャプチャできない作品も結構あるみたいです。。。
 *  原因は何なんだろう。
 * ※初期値にはyd_niku様のMikanGridをお借りしました。多謝!
 *  http://wonderfl.net/code/b6a4645461857e6f46909aea3787fe8dd30e4830
 */
package
{
    import flash.text.*;
    import flash.display.*;
    import flash.net.*;
    import flash.events.*;
    import flash.utils.*;
    import flash.system.*;
    
    import com.adobe.images.PNGEncoder;
    
    import net.wonderfl.utils.WonderflSWFUrl;
    
    public class ImagePublisher extends Sprite
    {
        private var _baseSprite:Sprite;
        private var _loadBtn:Sprite;
        private var _clearBtn:Sprite;
        private var _saveBtn:Sprite;
        private var _ba:ByteArray;
        private var _inputField:TextField;
    	
        public function ImagePublisher()
        {
            stage.scaleMode=StageScaleMode.NO_SCALE;
            
            // 読み込んだswfを書き込むBitmapData準備
            _baseSprite = new Sprite();
            addChild(_baseSprite);
            
            // 入力フォーム作る
            var form:Sprite = new Sprite();
            var tf:TextField = new TextField();
            tf.text = 'http://wonderfl.net/code/';
            tf.selectable = false;
            tf.textColor = 0xFFFFFF;
            tf.width = 120;
            tf.height = 15;
            tf.y = 2;
            form.addChild(tf);
            _inputField = new TextField();
            _inputField.type = TextFieldType.INPUT;
            _inputField.border = true;
            _inputField.borderColor = 0x666666;
            _inputField.width = 200;
            _inputField.height = 15;
            _inputField.background = true;
            _inputField.backgroundColor = 0xFFFFFF;
            _inputField.x = 120;
            form.addChild(_inputField);
            
            // ボタン作る
            _loadBtn = new Sprite();
            _loadBtn.graphics.beginFill(0x992222);
            _loadBtn.graphics.drawRect(0, 0, 50, 16);
            _loadBtn.graphics.endFill();
            _clearBtn = new Sprite();
            _clearBtn.graphics.beginFill(0x222299);
            _clearBtn.graphics.drawRect(0, 0, 50, 16);
            _clearBtn.graphics.endFill();
            _saveBtn = new Sprite();
            _saveBtn.graphics.beginFill(0x666666);
            _saveBtn.graphics.drawRect(0, 0, 50, 16);
            _saveBtn.graphics.endFill();
	    form.addChild(_loadBtn);
	    form.addChild(_clearBtn);
	    form.addChild(_saveBtn);
            
    	    // ボタンにラベルを貼る
    	    tf = new TextField();
    	    tf.text = 'load';
    	    tf.textColor = 0xFFFFFF;
            tf.selectable = false;
            tf.x = 12;
            tf.y = 1;
    	    _loadBtn.addChild(tf);
            tf = new TextField();
            tf.text = 'clear';
            tf.textColor = 0xFFFFFF;
            tf.selectable = false;
            tf.x = 12;
            tf.y = 1;
            _clearBtn.addChild(tf);
            tf = new TextField();
            tf.text = 'save';
            tf.textColor = 0xFFFFFF;
            tf.selectable = false;
            tf.x = 12;
            tf.y = 1;
            _saveBtn.addChild(tf);
            
            // 説明
            var intro:TextField = new TextField();
            intro.text = 'wonderflのSWFをキャプチャして、画像として保存します。';
            intro.autoSize = TextFieldAutoSize.LEFT;
            intro.selectable = false;
            intro.textColor = 0xFFFFFF;
            var note:TextField = new TextField();
            note.text = '※スペースキーでも保存できます。';
            note.autoSize = TextFieldAutoSize.LEFT;
            note.selectable = false;
            note.textColor = 0xFFFFFF;
            form.addChild(note);
            
            // パネルにまとめる
            var panel:Sprite = new Sprite();
            panel.addChild(intro);
            panel.addChild(form);
            addChild(panel);
            
    	    // 位置を調節
            intro.x = 5;
            intro.y = 5;
            form.x = 5;
            form.y = intro.height + 5;
            
            panel.x = 0;
            panel.y = 0;
            _loadBtn.x = 321;
            _loadBtn.y = 0;
    	    _clearBtn.x = 371;
            _clearBtn.y = 0;
    	    _saveBtn.x = 0;
            _saveBtn.y = intro.y + intro.height;
            note.x = 60;
            note.y = intro.y + intro.height + 2;
            
            // パネル装飾
            panel.graphics.beginFill(0x000000);
            panel.graphics.drawRect(0, 0, 435, 65);
            panel.graphics.endFill();
            panel.alpha = 0.8;
            
            // event
            _loadBtn.addEventListener(MouseEvent.CLICK, loadBtnClickHandler);
            _clearBtn.addEventListener(MouseEvent.CLICK, clearBtnClickHandler);
            _saveBtn.addEventListener(MouseEvent.CLICK, saveBtnClickHandler);
            stage.addEventListener(KeyboardEvent.KEY_UP, stageKeyUpHandler);
            _inputField.addEventListener(KeyboardEvent.KEY_UP, inputFieldKeyUpHandler);
            
            // default値設定
            _inputField.text = 'b6a4645461857e6f46909aea3787fe8dd30e4830';
            loadBtnClickHandler();
	}
        
        /**
         * 入力されたURLからSWFをロード
         */
        private function loadBtnClickHandler(e:MouseEvent = null):void
        {
            var url:String = 'http://wonderfl.net/code/' + _inputField.text;
            var path:String = WonderflSWFUrl.getURLFromPageURL(url);
            if(path == null)
            { // 正しいURLではなかった
                _inputField.backgroundColor = 0xFF0000;
                return;
            }
            else
            {
                _inputField.backgroundColor = 0xFFFFFF;
            }
            var ldr:Loader = new Loader();
            var context:LoaderContext = new LoaderContext(true);
            context.applicationDomain = ApplicationDomain.currentDomain;
            
            ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event):void
            {
                // 表示
                _baseSprite.addChild(ldr);
            });
            
            ldr.load(new URLRequest(path), context);
        }
        
        /**
         * 表示中のSWFを全消去
         */
        private function clearBtnClickHandler(e:MouseEvent):void
        {
            var length:int = _baseSprite.numChildren;
            for(var i:int = 0; i < length; i++)
            {
                _baseSprite.removeChildAt(0);
            }
        }
        
        /**
         * 表示中のSWFのPNG画像を出力
         */
        private function saveBtnClickHandler(e:MouseEvent = null):void
        {
            // 外部swfをPNG化
            var bmd:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight);
            bmd.draw(_baseSprite);
            _ba = PNGEncoder.encode(bmd);
            
            // 保存ダイアログ表示
            var fr:FileReference = new FileReference();
            fr.save(_ba, 'wonderfl.png');
        }
        
        /**
         * saveボタンの代わりにキーボードからでも保存できるようにする
         */
        private function stageKeyUpHandler(e:KeyboardEvent):void
        {
            if(e.charCode == 32)
            {
                saveBtnClickHandler();
            }
        }
        
        /**
         * loadボタンの代わりにキーボードからでも読み込みできるようにする
         */
        private function inputFieldKeyUpHandler(e:KeyboardEvent):void
        {
            if(e.charCode == 13)
            {
                loadBtnClickHandler();
            }
        }

    }
}