Adobe AIRアプリケーションにLoaderクラスを利用してロードされた画像ファイル、内部的に圧縮されたSWFファイルではなくて独自なフレームとして保存されます(そのような話について、正式なドキュメントとか資料はないようですが、誰か知ってるとぜひ教えていただきますね)。
BitmapDataをPNGやJPEGなどをエンコードして、loadBytesメソッドでLoaderにロードして、終わったらLoaderInfoクラスのbytesというプロパティでSWFに出力するようになります。そうする、SWFフォーマット画像ファイルをローカルに保存することをできました。注意しなければいけないのは、そのような操作はAdobe AIRだけです。ほかのウェブ系とかはいけないです。
下記はBitmapDataクラスからローカルswfファイルを生成/保存するメソッドです。
- /* create bitmap to be saved as an swf file */
- var bd:BitmapData = new BitmapData(320,240);
- /* capture application snapshot, this can be any other object */
- bd.draw( Application.application as IBitmapDrawable );
作ったビットマップファイルをPNGやJPEGなどバーチャルファイルにエンコード処理を必要となります。ここの「バーチャル」というのは、ByteArrayクラスを使ってメモリ中に格納とすることです。サンプル中にはmx.graphics.codec.PNGEncoderを利用してバーチャルファイルを作成とします。
- /* create virtual png file */
- var png:ByteArray = ( new PNGEncoder() ).encode( bd );
最後はLoaderクラスでバーチャルファイルをロードします。下記のようなソースでロードを終了するとsaveContentToSWFメソッドが実行されます。
- /* load virtual png image */
- var l:Loader = new Loader();
- l.contentLoaderInfo.addEventListener( Event.COMPLETE, saveContentToSWF );
- l.loadBytes( png );
以下はsaveContentToSWFメソッドソース:
- function saveContentToSWF( event : Event ):void
- {
- /* create output file on desktop */
- var file:File = File.desktopDirectory.resolvePath('out.swf');
- var fs:FileStream = new FileStream(); fs.open( file, FileMode.WRITE );
- /* pull out SWF bytes from Loader */
- fs.writeBytes( (evt.target as LoaderInfo).bytes );
- fs.close();
- }
上記のメソッドは圧縮してないswfファイルが生成されます。実際運用するとき、圧縮しないとサイズが大きいですから、圧縮処理を必要です。以下は圧縮機能を付けって保存メソッドです。
- function saveContentToSWF_compress( event : Event ):void
- {
- var file:File = File.desktopDirectory.resolvePath('out_c.swf');
- var fs:FileStream = new FileStream();
- fs.open( file, FileMode.WRITE );
- /* compressed file header */
- var swf_head : ByteArray = new ByteArray();
- swf_head.endian = Endian.LITTLE_ENDIAN;
- swf_head.writeBytes( (evt.target as LoaderInfo).bytes, 0, 8 );
- swf_head[0] = 0x43; // 'C' letter, indicates that file is compressed
- swf_head.position = 0;
- /* compressed file body */
- var swf_body : ByteArray = new ByteArray();
- swf_body.endian = Endian.LITTLE_ENDIAN;
- swf_body.writeBytes( (evt.target as LoaderInfo).bytes, 8 );
- swf_body.position = 0;
- swf_body.compress();
- swf_body.position = 0;
- /* write it down to file */
- fs.writeBytes( swf_head );
- fs.writeBytes( swf_body );
- fs.close();
- };
リソース:
Posted on Friday, 16th January 2009 by admin
Tags: Adobe, AIR, BitmapData, loadBytes, Loader, PNGEncoder, SWF
Posted in AIR, ニュース | Comments (0) | 20,412 views
