2011-07-28 11 views
1

私のアプリケーションは、大きなカスタムツリーをユーザーに表示することから成り立っています。 。それが記載されたエラーメッセージを取得するために開始し、私は周りが記載されているが、寸法に近い画像を書き出すことができた大きなFlexコンポーネントの画像を保存する方法(EX:25000px、3000px @ 72dpi)

var image:ImageSnapshot = ImageSnapshot.captureImage(this, 72, new PNGEncoder(), false); 

:私は彼らが、ボタンのクリックイベントに関連付けられたコードの次の行で画像をエクスポートすることができます15秒以内に回転した後、以下のように表示されます。

Error: Error #1000: The system is out of memory. 
    at flash.utils::ByteArray/writeBytes() 
    at mx.graphics::ImageSnapshot$/mergePixelRows()[E:\dev\4.x\frameworks\projects\framework\src\mx\graphics\ImageSnapshot.as:511] 
    at mx.graphics::ImageSnapshot$/captureAll()[E:\dev\4.x\frameworks\projects\framework\src\mx\graphics\ImageSnapshot.as:482] 
    at mx.graphics::ImageSnapshot$/captureImage()[E:\dev\4.x\frameworks\projects\framework\src\mx\graphics\ImageSnapshot.as:318] 
    at vertical/saveChart()[C:\devel\workspace\vertical\src\CustomObject.mxml:501] 
    at vertical/__saveImageBtn_click()[C:\devel\workspace\vertical\src\CustomObject.mxml:574] 

ブラウザのFlashplayerプラグインにメモリ不足がありますか?私は自分のタスクマネージャーに約1.2GBのメモリ使用量があることに気づいた(私のシステムでは4GBを持っている)。その場合、上記のImageSnapshot.captureImage()コールのような特定の関数のメモリ使用量を制限することは可能ですか?

コンポーネントを2つまたは4つのImageSnapshotオブジェクトに生成し、後でそれらを一緒に分割する方法がありますか?

アドバイスをいただければ幸いです。

+0

25000x3000のディメンションでは、生のビットマップデータ*を保持するために少なくとも214MB *を見ています(これはピクセルあたり3 RGBバイトの最小値を仮定しています - トランスペアレントビットマップの場合は71MBを追加します)。画像に何らかの操作を加えると、このデータが数回コピーされる可能性があります。おそらく、バッチで作業するために使用しているクラスを変更する必要があります(非同期PNGエンコーダを探す)。そして、それでは、あなたが選んだPNGエンコーダの中で、ByteArray.compress()への単一の巨大な呼び出しがあります。 – Cameron

答えて

1

私は最新のFlash Player 11は、この問題を解決するための新機能があると考えていません:「拡張高解像度のビットマップのサポート

- BitmapDataオブジェクトは、もはや16メガピクセル(16,777,215ピクセル)の最大解像度に限られており、最大のビットマップの幅/高さはもはや8,191ピクセルに制限されず、非常に大きなビットマップを利用するアプリケーションの開発が可能になります。 this PDFから

+0

興味深いことに、そのルートは最初にコンポーネントをBitmapDataに変換してからByteArrayに変換し、最後にそれをpng/jpgに正しく変換するでしょうか? Flashplayer 11はまだベータ版ですが、公式リリースがあるまではこれを使用することはできません。他に誰もアイデアやソリューションがなければ、私はこのルートをやりますが、FP11が間に合うようになるまで、ソフトウェアのこの部分を保留にすることができます。 – PublicHandle

1

あなたがBitmapDataを使用している場合、それはあなたが標的にされているのFlashPlayer違います:

バージョンVS最大BITMAPSIZE

のFlashPlayer -9:2880x2880ピクセル
のFlashPlayer 10:4096×4096ピクセル
を flashplayer 11:無制限

私はあなたがこの巨大なキャプチャと正確に何をしようとしているのかわかりませんが、私はお勧めしますタイル張り。比較的小さなビットマップの塊に分解してください。それらを別々に作成するので、メモリ内に膨大な量のデータを開く/作成する必要はありません。

Error #1000 out of memoryのエラーがなくても、大きなサイズの画像をエンコードできるかどうかは分かります。