2

大きな画像を地図として使用する必要があるプロジェクトに取り組んでいます。画像は約 95MB で、解像度は 12100 x 8000 ピクセルです。

一度に画像全体が必要なわけではなく、1000 x 1000 ピクセルの詳細が必要なだけです (常に同じ詳細であるとは限りません。同じ部分をつかむだけでは使用できるソリューションではありません)。だから私はそれを単にサンプリングすることはできませんBitmapOptions.

私は周りを見回して、FileInputStream(画像はSDカードにあります)を作成するというアイデアを見つけましたdecodeStream(InputStream is, Rect outPadding, BitmapFactory.Options opts). そうすれば、すべてをメモリにロードしません。試してみましたが、画像を読み込もうとするとクラッシュします。これが私のコードです:

FileInputStream stream = null;
try {
    stream = new FileInputStream(path);
} catch(Exception e) {
    Log.e("inputstream",e.toString());
}
Rect rect = new Rect(a,b,c,d);
return BitmapFactory.decodeStream(stream, rect, null);    

画像を読み込もうとすると、アクティビティが終了し、LogCat が教えてくれjava.lang.outOfMemoryErrorます。なぜクラッシュするのですか?ストリームでは「オンザフライ」で画像で動作するはずだと思いましたが、エラーについて私が持っている唯一の説明は、穴の画像をメモリにロードしようとすることです。画像から詳細をロードする方法、またはこのアイデアがうまくいかない理由を誰か知っていますか?

4

2 に答える 2

1

これらすべての95Mが処理のためにメモリに吸い込まれたため、クラッシュしました。この呼び出しは、ストリームの一部を無視しません。すべてをメモリに入れてから、それを操作しようとします。あなたが持つことができる唯一の解決策は、同じ種類の操作を行うある種のサーバー側コードを用意することです。または、サーバー上でそれを実行したくない場合は、大きな画像のサムネイルを提供します。そして、とにかくいつでも95M全体を引っ張らないように強くお勧めします

于 2012-11-07T19:17:16.897 に答える
0

BitmapRegionDecoder は役に立ちませんか (レベル 10 を認識しています)。

于 2012-11-08T12:28:18.157 に答える