サーバを経由せずに Flash の内容を画像に変換する

Flash で描画したベクター画像を img タグで表示させるデモを作った。肝はサーバプログラムを経由しないところ。 IE 以外のモダンブラウザなら、下の灰色の領域に線を描くと、その下に PNG 画像が現れるはず。

ペイントツール部分は、func09 さんのソースをお借りした。

仕組み

  1. PNGEncoderPNG の ByteArray を作る
  2. その ByteArray を Base64 エンコードする
  3. その文字列を ExternalInterface でブラウザに送る
  4. data スキーマで画像を表示させる
    <pre>var bmp:BitmapData = new BitmapData(300, 300);
    bmp.draw(canvas);
    var base64Text:String = Base64.encodeByteArray(PNGEncoder.encode(bmp));
    ExternalInterface.call("putImage", base64Text);
    </pre>

    <script type="text/javascript">
    var flashvars = {};
    var params = {
      "allowScriptAccess" : "always"
    };
    var attributes = {};
    swfobject.embedSWF("/mt-files/client-side-paint/Paint.swf", "flashContainer", "300", "300", "9", null, flashvars, params, attributes);
    //var so = new SWFObject("http://bitmap.dyndns.org/blog/files/client-side-paint/Paint.swf", "paint", "300", "300", "9", "white");
    //so.addParam("allowScriptAccess", "always");
    //so.write("flashContainer");
    function putImage(base64Text) {
      document.getElementById("canvas").innerHTML = '<img src="' +"data:image/png;base64," +base64Text + '" style="border:none;margin:none;">';
    }
    </script>