Adobe AIRアプリケーションにLoaderクラスを利用してロードされた画像ファイル、内部的に圧縮されたSWFファイルではなくて独自なフレームとして保存されます(そのような話について、正式なドキュメントとか資料はないようですが、誰か知ってるとぜひ教えていただきますね)。

BitmapDataをPNGやJPEGなどをエンコードして、loadBytesメソッドでLoaderにロードして、終わったらLoaderInfoクラスのbytesというプロパティでSWFに出力するようになります。そうする、SWFフォーマット画像ファイルをローカルに保存することをできました。注意しなければいけないのは、そのような操作はAdobe AIRだけです。ほかのウェブ系とかはいけないです。

下記はBitmapDataクラスからローカルswfファイルを生成/保存するメソッドです。

  1. /* create bitmap to be saved as an swf file */
  2.  var bd:BitmapData = new BitmapData(320,240);
  3.  /* capture application snapshot, this can be any other object */
  4.  bd.draw( Application.application as IBitmapDrawable );

作ったビットマップファイルをPNGやJPEGなどバーチャルファイルにエンコード処理を必要となります。ここの「バーチャル」というのは、ByteArrayクラスを使ってメモリ中に格納とすることです。サンプル中にはmx.graphics.codec.PNGEncoderを利用してバーチャルファイルを作成とします。

  1. /* create virtual png file */
  2.  var png:ByteArray = ( new PNGEncoder() ).encode( bd );

最後はLoaderクラスでバーチャルファイルをロードします。下記のようなソースでロードを終了するとsaveContentToSWFメソッドが実行されます。

  1. /* load virtual png image */
  2.  var l:Loader = new Loader();
  3.  l.contentLoaderInfo.addEventListener( Event.COMPLETE, saveContentToSWF );
  4.  l.loadBytes( png );

以下はsaveContentToSWFメソッドソース:

  1. function saveContentToSWF( event : Event ):void
  2. {
  3.  /* create output file on desktop */ 
  4.  var file:File = File.desktopDirectory.resolvePath('out.swf');
  5.  var fs:FileStream = new FileStream(); fs.open( file, FileMode.WRITE );
  6.  
  7.  /* pull out SWF bytes from Loader */ 
  8.  fs.writeBytes( (evt.target as LoaderInfo).bytes );
  9.  
  10.  fs.close();
  11. }

上記のメソッドは圧縮してないswfファイルが生成されます。実際運用するとき、圧縮しないとサイズが大きいですから、圧縮処理を必要です。以下は圧縮機能を付けって保存メソッドです。

  1. function saveContentToSWF_compress( event : Event ):void
  2. {
  3.  var file:File = File.desktopDirectory.resolvePath('out_c.swf');
  4.  var fs:FileStream = new FileStream();
  5.  fs.open( file, FileMode.WRITE );        
  6.  
  7.  /* compressed file header */
  8.  var swf_head : ByteArray = new ByteArray();
  9.  swf_head.endian = Endian.LITTLE_ENDIAN;
  10.  swf_head.writeBytes( (evt.target as LoaderInfo).bytes, 0, 8 );
  11.  swf_head[0] = 0x43; // 'C' letter, indicates that file is compressed
  12.  swf_head.position = 0;
  13.  
  14.  /* compressed file body */
  15.  var swf_body : ByteArray = new ByteArray();
  16.  swf_body.endian = Endian.LITTLE_ENDIAN;
  17.  swf_body.writeBytes( (evt.target as LoaderInfo).bytes, 8 );
  18.  swf_body.position = 0;
  19.  swf_body.compress();
  20.  swf_body.position = 0;        
  21.  /* write it down to file */
  22.  fs.writeBytes( swf_head );
  23.  fs.writeBytes( swf_body );
  24.  fs.close();        
  25. };

リソース:

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

メインコンテンツEND ■
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Posted on Friday, 16th January 2009 by admin

Tags: , , , , , ,
Posted in AIR, ニュース | Comments (0) | 6,576 views

Related Posts

Leave a Reply