SWFフォーマット画像ファイルをローカルに保存とするAdobe AIRアプリケーション

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();
};

リソース:

http://www.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&postId=9364&productId=2&loc=en_US

Leave a Reply

Your email address will not be published. Required fields are marked *