2016-06-28 20 views
1

まずは、Androidがビットマップを読み込む際に厳しい制約を課していることを知っています。私は必要なビットマップをロードして使用する簡単な方法があるかどうかを理解しようとしています。BitmapFactory.decodeResource(メモリ不足)

私は2800×2800のARGB画像を持っています。私は、ズームインしてパンすることができる必要があります。 2800 x 2880のARGBイメージは約31 MBのメモリが必要です。私はそれが大きいことを認識します。私はそれをロードしようとすると、しかし、私は

はそれが約4倍のサイズが必要なメモリのチャックを割り当てている理由私は好奇心が強い... 125440012バイトの割り当てを割り当てること

を失敗したというエラーを取得します画像を保持する。それは期待されているのか、何か問題が起こっているのでしょう

BitmapFactory.decodeResource(getResources(), resID, options); 

ロードこの画像は私がそれを試してみた、すべてのiOSデバイス上で正常に動作し、それはネクサス2013タブレット上で正常に動作します:私は使用してイメージをロードしています。しかし、それは私がテストするために持っているAndroidの携帯電話で失敗している。

私は間違いなく、イメージの部分領域を読み込んでそれらを管理することを避けたいと思います(BitmapRegionDecoderのようなものを使用します)。シンプルな何かの考えは何ですか?

+0

あなたの画像はどのリソースディレクトリにありますか?あなたは[デフォルトでスケーリングされた画像]を取得している可能性があります(http://stackoverflow.com/a/23047893/1676363) – ianhanniballake

答えて

1

Androidドキュメントには、loading bitmpas efficientlyについての簡単なガイドがあります。基本的に、元のビットマップの縮小版をRAMにロードする必要があります。通常、画面の領域に表示するために非常に大きなビットマップを読み込む必要はないからです(画面の解像度が1920x1080、あなたは2800x2800のビットマップを読み込むメモリを無駄にしています)。

0

は、それは私が最初のフル解像度の画像をロードしようとしていることによってそれを解決することを決定したAndroidデバイス

Bitmap bitmap=BitmapFactory.decodeResource(getResources(), resID, options); 
final Bitmap resized = Bitmap.createScaledBitmap(bitmap, 1280, 720, true); 
0

のあまりラムを取ることはありませんので、ビットマップのサイズを変更してください。これはほとんどのデバイスで成功します。私はtryブロックでそれを行い、OutOfMemory例外をキャッチします。キャッチブロックでは、ピンチで動作する縮小解像度で読み込みます。