3

以下のコードで OutOfMemory が発生する可能性はありますか? アプリケーションのメモリ制限を超えることができると思います。

Matrix matrix = new Matrix();
matrix.postRotate(orientation);

image = Bitmap.createBitmap(image, 0, 0, image.getWidth(), image.getHeight(), matrix, true);

Android で画像を回転させる最良の方法は何ですか?

新しいプロセスのサービスに割り当てて、ヒープを増やしますか?

@CommonsWare はこのリンク [1] で、多くの開発者がヒープを増やすことが非効率なコーディングの解決策であると考えていると述べています。

この質問は、ヒープも大きいことを示しています [2]。

もっと簡単な解決策はありますか?

[1]別のプロセスで IntentService を開始できますか?

[2]画像を回転させているときに OutOfMemory ex を回避するにはどうすればよいですか?

4

4 に答える 4

2

簡単に言えば、はい、このコードは OutOfMemory を引き起こす可能性があります。アプリのヒープサイズを増やすよりも簡単な解決策はないと思います。私は @CommonsWare が正しいと信じており、多くの場合 OutOfMemory はプログラミングが間違っていることを示しています。しかし、非常に大きなメモリが必要になる場合もあります。巨大な画像の回転は間違いなくそのような状況の 1 つです。

ヒープ サイズの増加を要求する代わりにネイティブ コード (NDK) を使用できますが、これは明らかに簡単ではありません。それでも大量のメモリが必要になるため、C++ を使用する利点はありません (2.3 で動作することを除いて)。

于 2013-08-22T06:03:55.990 に答える
0

ここ:

image = Bitmap.createBitmap(image, 0, 0, image.getWidth(), image.getHeight(), matrix, true);

コードは 2 つのビットマップを操作します。最初のビットマップimageは、Bitmap以前に RAM にロード/デコードして操作し、実際に回転させたものです。そして、結果を同じ変数に格納しても、2 つ目は Bitmap.createBitmap() によって作成されます。とにかく、この行ではビットマップ x2 RAM が必要であり、これにより確実に OOM が発生します (デバイスのカメラで可能な最大の写真について言えば)。
ここでは NDK を使用するのが最善の解決策だと思います。追加の可能な解決策 (MappedByteBuffer) については、ここで私の同じ質問
を 確認してください。NDK/JNI ソリューションへのリンクもあります。

于 2015-01-28T12:37:31.237 に答える