0

「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 を失います。何が問題なのか誰にもわかりませんか?

4

1 に答える 1

0

この2行のあと…

bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(image, bmOptions);

...bmOptions には、デコードが機能した場合にのみ、有効な outHeight と outWidth が含まれます。そうでない場合は、指摘したように -1 が含まれます。

確認するにはデバッグする必要がありますが、画像が何らかの形で null または無効であることがあると思われます。

これは、複数の写真を連続して撮影すると発生するとおっしゃっています。おそらく、ガベージ コレクターが追いついていないか、処理中に画像/ビットマップへの参照を解放していませんか? カメラをトリガーして結果をキャプチャする方法は何ですか?

ローテーションに関する 2 番目のポイントについては、これが問題になる可能性があります。

  • あなたのアプリ/アクティビティは縦向きです
  • ポートレートで始まるカメラをトリガーします
  • カメラで横向きに回転します
  • ランドスケープ用にすぐに再作成されるアプリ/アクティビティに戻ります。この時点で画像への参照が失われている可能性はありますか?
于 2013-10-31T12:39:22.530 に答える