「Androidで画像をロードする」というトピックに関するスレッドがたくさんあることは知っていますが、残念ながら、それらのいずれにも問題の解決策が見つかりませんでした。だからここに私の問題があります:
大きな画像を保存し、後でトリミングに使用する別の画像を保存したいのですが、私のコードは次のとおりです。
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(image, bmOptions);
final int REQUIRED_SIZE = 800;
int scale = 1;
while (bmOptions.outWidth / scale / 2 >= REQUIRED_SIZE && bmOptions.outHeight / scale / 2 >= REQUIRED_SIZE) {
scale *= 2;
}
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scale;
bmOptions.inPurgeable = true;
bmOptions.inInputShareable = true;
// create the Image for the original File
try {
File origFile = File.createTempFile(origImage, JPEG_FILE_SUFFIX, getAlbumDir());
OutputStream fOut2 = new FileOutputStream(origFile);
Bitmap thePic = BitmapFactory.decodeFile(image, bmOptions);
thePic.compress(Bitmap.CompressFormat.JPEG, 100, fOut2);
fOut2.flush();
fOut2.close();
} catch (Exception e) {
Log.e(TAG, "Cannot create original Image");
}
mImageBitmap = BitmapFactory.decodeFile(image, bmOptions);
このコードは、約 90% の確率で機能します。しかし、時にはbmOptions.outHeight
&bmOptions.outWidth returns -1
と行でBitmap thePic = BitmapFactory.decodeFile(image, bmOptions);
私は例外を受け取ります:
10-31 12:07:31.645: E/AndroidRuntime(16618): java.lang.OutOfMemoryError
10-31 12:07:31.645: E/AndroidRuntime(16618): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
10-31 12:07:31.645: E/AndroidRuntime(16618): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:652)
10-31 12:07:31.645: E/AndroidRuntime(16618): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:391)
私が問題だと思うことは次のとおりです。
- 複数の写真を連続して撮影すると、しばらくするとこのエラーが発生することがあります
- 写真を撮りながらディスプレイを回すと発生します
しかし、多くのテストを行った後でも、この 2 つの可能性のいずれかが正しいのか、それとも別の何かが間違っているのかはまだわかりません。
私が間違っていることを誰か知っていますか?
編集:
アプリで多くのテストを行った後、次の問題があります。
プロセスを開始するたびに、約 2 MB の RAM が失われます。つまり、しばらくするとアプリが閉じます。
この問題を解決するために私がしたこと:
-) 元の画像を作成しないでください -) サンプルサイズを 16 に設定します (計算された 2 ではなく) -) ビットマップを完全に削除します
問題は同じままです。私はいつも 2 MB の RAM を失います。何が問題なのか誰にもわかりませんか?