0

私たちは、携帯電話のギャラリーから大きな画像 (5MP+) を処理し、最終的に base 64 でエンコードし、JSON 化してアップストリーム サーバーに送信するネイティブ Android アプリに取り組んでいます。他の StackOverflow の質問で提供されているガイダンスの一部を使用しました。logcat を綿密に追跡し、デバッグなどを行い、メモリ使用量を最小限に抑えるために懸命に努力してきました。また、「80% のユース ケース」を制御できるようになりましたが、特定のケース (ユーザーが写真をキャンセルし、別の写真を選択するなど)。

5MP のビットマップをインポートすると、ヒープのサイズが 4 倍になることがわかりました (つまり、7Mb の jpeg はメモリ内で 28Mb になります)。可能な限り効率的に Base64 に変換するためのトリックを使用しました。JSON パーサーがリークしていないことなどを確認しました。

元の質問に戻ると、Android のビットマップ処理を回避する方法はありますか?

4

1 に答える 1

2

最終的に Base 64 でエンコードされ、JSON 化されてアップストリーム サーバーに送信されます

バイナリ ペイロードをサポートするように Web アプリを書き直して、このようなばかげたことをする必要がないようにします。JSON でエンコードされたメタデータを 1 つのリクエストでアップロードし、必要に応じて別のリクエストで元の形式の画像をアップロードします。または、マルチパート アップロードを使用して両方を 1 回のショットで実行し、画像を元の形式のままにします。

5MP ビットマップをインポートすると、ヒープのサイズが 4 倍になることがわかりました (つまり、7Mb の jpeg はメモリ内で 28Mb になります)。

これは、PNG や JPEG などは圧縮されており、画像を表示するには圧縮を解除する必要があるためです。

Android のビットマップ処理を回避する方法はありますか?

画像を表示しようとしているかどうかはわかりません。その場合は、BitmapFactory適切な を使用しBitmapFactory.Optionsて画像をスケーリングします。

画像を表示するつもりがない場合は、バイナリ ペイロードを受け入れるように Web アプリを書き直せば、画像全体をメモリに読み込む必要はありません。既にある形式でアップロードするだけで、一度にチャンク (8KB など) を読み取って、アップロード用に (またはその他のものに)書き込みOutputStremます。HTTP PUT

于 2012-10-18T15:11:53.860 に答える