大きな画像(ビットマップ)を使用する場合、最終的には画像が(表示されるために)許可されているサイズで壁にぶつかります。この制限がどこにあるか誰かが知っているのだろうか?これには、電話の最大ヒープサイズなど、多くの要因があります。
また、大きな画像を表示して相互作用可能にしたい場合は、大きな画像を処理するための回避策はありますか?
すでにデコードされた画像データがある場合は、それらをストレージ上のファイルに保存してから、このバッファーをmmapできます。
次に、 createBitmap関数を使用して、このバッファー上にサブイメージ(タイル)を作成できます。
MMマップされたメモリ領域は、ヒープに対してカウントされず、ガベージコレクションの対象ではなく、通常のファイル操作をバイパスしてページングサブシステムによって処理されます。
大きな画像サイズを圧縮するには、
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, bytes);
画像全体を全画面表示する場合は、組み込みアプリケーションに委任します。
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(uri, "image/jpeg");
startActivity(i);
サムネイルなどで表示したい場合は、こちらのドキュメントをお読みください。
この記事では、大きなビットマップの操作とメモリの制約の処理について説明します。また、ヒープサイズ、メモリにロードされた他のビットマップ、メモリの断片化など、OutOfMemoryErrorsを引き起こすいくつかの要因についても説明します。最後に、可能な限り最大の画像ファイルをメモリに動的にロードし、変換を実行するアルゴリズムを提供します。
http://bricolsoftconsulting.com/handling-large-images-on-android/