PNG クラス

  • BitmapData? から PNG フォーマットされた ByteArray? へのエンコード
  • PNG フォーマットされた ByteArray? をちょっとだけデコードして主要なメタデータ等を XML に変換(表示用のデコードは Loader.loadBytes() で)

特徴

  • Alchemy の機能で非同期処理が可能
  • libpng の機能でフィルタ処理が可能(バイト配列の冗長化で deflate 圧縮の効果を高める → ファイルサイズが小さくなる)
  • zlib の機能で圧縮率の設定が可能(0 高速無圧縮 ~ 9 低速高圧縮)
  • 非同期処理中に進捗状況を知らせるイベントを発行

ダウンロード

ソース

クラスパス

  • lib/as 以下の jp ディレクトリ
  • lib/swc 以下の png.swc

同期エンコード

new します。
encodeSync() メソッドで BitmapData? を渡します。
エンコードされた ByteArray? に data プロパティでアクセスします。

private function _init():void 
{
	var png:PNG = new PNG();
	png.encodeSync(bitmapData);
	
	trace(png.data.length);
	trace(png.toXML());
}

非同期エンコード

new します。
encodeAsync() メソッドで BitmapData? を渡します。
完了後、エンコードされた ByteArray? に data プロパティでアクセスします。

private function _init():void 
{
	var png:PNG = new PNG();
	png.addEventListener(Event.OPEN, _onOpen);
	png.addEventListener(ProgressEvent.PROGRESS, _onProgress);
	png.addEventListener(Event.COMPLETE, _onComplete);
	png.encodeAsync(bitmapData);
}

private function _onOpen(e:Event):void 
{
	trace(e);
}

private function _onProgress(e:ProgressEvent):void 
{
	trace(e.bytesLoaded, e.bytesTotal);
}

private function _onComplete(e:Event):void 
{
	var png:PNG = e.currentTarget as PNG;
	
	trace(png.data.length);
	trace(png.toXML());
}

png.swc について

png.gg から png.swc を再度コンパイルする場合、 /src/alchemy/fileformats/png に zliblibpng を入れてそれぞれ make しておく必要があります。

  • zlib
    $ alc-on
    $ ./configure
    $ make
    $ alc-off
    
  • libpng
    $ alc-on
    $ make -f scripts/makefile.gcc
    $ alc-off
    
  • png.gg から png.swc をコンパイル
    $ alc-on
    $ sh build.sh
    $ alc-off
    

デモ