pixel bender のpbjファイルをbase64エンコードしてAS3にするツール
選んだファイルを Base64 エンコードするサンプル
外部サーバを通さずに、 Flash 内でファイルの処理を行います。
// forked from hikipuro's 2009-3-14 選んだファイルを Base64 エンコードする
package
{
import flash.display.Loader;
import flash.display.SimpleButton;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.FileFilter;
import flash.net.FileReference;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.utils.ByteArray;
import mx.utils.Base64Encoder;
import flash.system.System;
/**
* 選んだファイルを Base64 エンコードするサンプル
*
* 外部サーバを通さずに、 Flash 内でファイルの処理を行います。
*/
public class PBJ2AS3 extends Sprite
{
/**
* ファイル参照オブジェクト
*/
private var fileReference:FileReference;
/**
* 文字列表示用
*/
private var textField:TextField;
/**
* ファイルを選択ボタン
*/
private var button1:SimpleButton;
/**
* クリップボードにコピーボタン
*/
private var button2:SimpleButton;
/**
* 選んだファイルを表示するローダ
*/
private var loader:Loader;
/**
* 選んだファイルの内容を指す ByteArray
*/
private var byteArray:ByteArray;
/**
* コンストラクタ
*/
public function PBJ2AS3():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
/**
* 初期化メソッド
* @param e
*/
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
// ファイルの選択ボタンの作成
button1 = new SimpleButton();
button1.upState = makeButton(0xDDDDDD, 100, 20, 10, "ファイルの選択");
button1.overState = makeButton(0xEEEEEE, 100, 20, 10, "ファイルの選択");
button1.downState = makeButton(0xCCCCCC, 100, 20, 10, "ファイルの選択");
button1.hitTestState = button1.upState;
button1.addEventListener(MouseEvent.MOUSE_DOWN, onSelectButtonDown);
button1.x = 5;
button1.y = 80;
addChild(button1);
// クリップボードにコピーボタンの作成
button2 = new SimpleButton();
button2.upState = makeButton(0xDDDDDD, 130, 20, 10, "クリップボードにコピー");
button2.overState = makeButton(0xEEEEEE, 130, 20, 10, "クリップボードにコピー");
button2.downState = makeButton(0xCCCCCC, 130, 20, 10, "クリップボードにコピー");
button2.hitTestState = button1.upState;
button2.addEventListener(MouseEvent.MOUSE_DOWN, onCopyButtonDown);
button2.x = 110;
button2.y = 80;
button2.visible = false;
addChild(button2);
// テキストフィールドの準備
textField = new TextField();
textField.selectable = false;
textField.autoSize = TextFieldAutoSize.LEFT;
textField.x = 0;
textField.y = 0;
textField.text = "選んだファイルを Base64 エンコードするサンプル\n\nボタンを押してファイルを選んでください。\n(100KB 以下程度のファイルを選んでください。大きいファイルは処理に時間がかかります。)";
addChild(textField);
// ローダーの準備
loader = new Loader();
loader.y = 110;
addChild(loader);
}
/**
* ファイルの選択ボタンが押された時
* @param event
*/
private function onSelectButtonDown(event:MouseEvent):void
{
fileReference = new FileReference();
// イベントの登録
fileReference.addEventListener(Event.SELECT, onSelect);
fileReference.addEventListener(Event.COMPLETE, onComplete);
// ファイル選択ダイアログを表示する
fileReference.browse([
new FileFilter("全て", "*.pbj"),
new FileFilter("画像ファイル (jpg, gif, png, swf)", "*.jpg;*.gif;*.png;*.swf"),
]);
}
/**
* クリップボードにコピーボタンが押された時
* @param event
*/
private function onCopyButtonDown(event:MouseEvent):void
{
if (byteArray == null) {
textField.text = "エラー";
return;
}
var base64encoder:Base64Encoder = new Base64Encoder();
base64encoder.encodeBytes(byteArray);
var str:String = "";
// 改行を取り除く
var str2:String = base64encoder.toString();
var len:uint = str2.length;
for (var i:uint = 0; i < len; i++) {
var sub:String = str2.substr(i, 1);
if (sub == "\n")
continue;
str += sub;
}
System.setClipboard(
"class ShaderLoader {\n import flash.display.Shader\n import mx.utils.Base64Decoder\n static public function load():Shader\n {\n var decoder:Base64Decoder = new Base64Decoder()\n decoder.decode(\""
+ str +
"\")\n return new Shader(decoder.toByteArray())\n }\n}\n"
);
textField.text = "コピーしました。";
}
/**
* ファイル選択イベント
* @param event
*/
private function onSelect(event:Event):void
{
fileReference.load();
}
/**
* 読み込み完了イベント
* @param event
*/
private function onComplete(event:Event):void
{
byteArray = fileReference.data;
loader.loadBytes(fileReference.data);
loader.scaleX = 0.5;
loader.scaleY = 0.5;
textField.text = "クリップボードにコピーボタンを押すと、\nBase64 エンコードされたデータをクリップボードにコピーできます。\n1 行の文字数がかなり多いので、貼り付ける時は注意してください。";
button2.visible = true;
}
/**
* ボタンを作って返す
* @param color 色
* @param width 幅
* @param height 高さ
* @param round 角丸の大きさ
* @param text ボタンのテキスト
* @return ボタン
*/
private function makeButton(color:uint, width:int, height:int, round:int, text:String):Sprite
{
var t:TextField = new TextField();
var s:Sprite = new Sprite();
s.graphics.lineStyle(2);
s.graphics.beginFill(color);
s.graphics.drawRoundRect(0, 0, width, height, round);
s.graphics.endFill();
t.text = text;
t.selectable = false;
t.width = width;
t.autoSize = TextFieldAutoSize.CENTER;
s.addChild(t);
return s;
}
}
}