2011-06-22 15 views
0

状況:ビットマップデータの圧縮

私は、既存のインポートされたMovieClipを一連のBitmapDataに変換する単純なMovieClip置換を作成しました。これにより、Flashが各フレームのMovieClipにベクターデータをレンダリングする必要がなくなります。

しかし、BitmapDataには大きなメモリフットプリントがあります。 BitmapDataをByteArrayに変換し、compress()メソッドを使用してみました。これにより、メモリ占有量が大幅に少なくなります。しかし、それは実用的ではないことが証明されている。再描画ごとに、ByteArrayを圧縮解除してから、SetPixelsを使用してデータを画面にblitしてから、フレームを再圧縮()してみました。これは動作しますが、非常に遅いです。

だから誰か他の人が私が試みることができるアプローチがあるのだろうかと思っていた。 Flashでは、ビットマップデータをメモリに圧縮し、画面に素早くblitできますか?

FlashでネイティブアニメーションGIFがどのように機能するのだろうか。 BitmapDataの背後でそれらを圧縮解除するのですか、またはフレーム圧縮解除をその場で実行しますか?

おそらく、圧縮されたイメージをblitしようとするAlchemyプロジェクトがありますか?あなたが提供できるすべてのアドバイスに

感謝:)

答えて

1

@ thienhaflashの返答は良いですが、年を経てからFlash PlayerとAIRランタイムは機能を拡張しました。今日私はAdobe's AS3 Guideから小さなおしゃべりをしました。プレーヤー11.3以降、ネイティブ画像圧縮技術が利用可能です。

// Compress a BitmapData object as a JPEG file. 
var bitmapData:BitmapData = new BitmapData(640,480,false,0x00FF00); 
var byteArray:ByteArray = new ByteArray(); 
bitmapData.encode(new Rectangle(0,0,640,480), new flash.display.JPEGEncoderOptions(), byteArray); 

、ブリットのための実用性についてはよく分からないが、それはそれはネイティブに行うことができることうれしいです:ここでは抜粋です。

0

メモリ予約の場合、あなたはビットマップシーケンスにムービークリップを変換する前に二度考える必要があります。それは本当に必要なのでしょうか?バックグラウンドのようなものがいくつかあるので静的である(または動き回っている)ので、ビットマップシーケンスではなく要素ごとにビットマップをキャッシュしないのはなぜですか?

私は通常、アニメーションビットマップ(MovieClipの代わりにビットマップシーケンスの名前)を使用しました。これは、小さなサイズのアニメーションアイコンやその他の重い計算のもの(火/煙の効果など)です。できるだけ多くのものを壊す!

私が知る限り、メモリにあるBitmapDataによって使用されるメモリを圧縮する方法はなく、Alchemyに関連するものは何もありません。

アニメーションGIFはFlashでネイティブに動作しません。そのためにはライブラリが必要です。 bytearray.comからAnimatedGIF as3ライブラリを検索すると、実際にライブラリは生のbyteArrayでgifファイルを読み込んだだけで、やったようにanimatedBitmapに変換されます。

0

これは古い質問ですが、これに関する最近の情報があります:jackson Dunstanはbitmapdatasで動作していましたが、圧縮されたソースから取得したビットマップデータは、未使用の時間の後に "収縮"します。 ここには記事があります:http://jacksondunstan.com/articles/2112、そしてその2つはその冒頭で参照されました。

だからあなたは絶対に何か行うことができます:

var byteArray:ByteArray = new ByteArray(); 
myBitmapData.encode(new Rectangle(0,0,640,480), new flash.display.JPEGEncoderOptions(), byteArray); 
var loader = new Loader(); 
loader.addEventListener(Event.COMPLETE, function(_e:Event):void{ 
    if(loader.content is Bitmap){ 
    myBitmapData.dispose() 
    myBitmapData= Bitmap(loader.content).bitmapData; 
    } 
}); 
loader.loadBytes(byteArray); 

を私はそれがそのままうまくいくかどうかわからないんだけど、あなたは間違いなく、より良いあなたの記憶を処理したいです。今ではmyBitmapDataは、読み込みを試みるときに圧縮解除され、約10秒間使用しないと再圧縮されます。

+0

これは非常に便利です。私はこの行動がモバイルでも見られるのだろうかと思う。 – Unknown123

+0

正直なところ私は知らないが、なぜそれが違うのか分からない。 – Boris