私のアプリケーションは、大きなカスタムツリーをユーザーに表示することから成り立っています。 。それが記載されたエラーメッセージを取得するために開始し、私は周りが記載されているが、寸法に近い画像を書き出すことができた大きな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
オブジェクトに生成し、後でそれらを一緒に分割する方法がありますか?
アドバイスをいただければ幸いです。
25000x3000のディメンションでは、生のビットマップデータ*を保持するために少なくとも214MB *を見ています(これはピクセルあたり3 RGBバイトの最小値を仮定しています - トランスペアレントビットマップの場合は71MBを追加します)。画像に何らかの操作を加えると、このデータが数回コピーされる可能性があります。おそらく、バッチで作業するために使用しているクラスを変更する必要があります(非同期PNGエンコーダを探す)。そして、それでは、あなたが選んだPNGエンコーダの中で、ByteArray.compress()への単一の巨大な呼び出しがあります。 – Cameron