1

ImageViewを使用して画像を表示する単純な Android アプリケーションを作成しています。ボタンをクリックすると、現在の画像に基づいて新しいビットマップが生成され、古い画像が置き換えられます。

私が使用した画像は大きくありません: 220 x 213 .

しかし、エミュレーターでボタンを5回クリックすると、エラーがスローされます。

 java.lang.OutOfMemoryError: bitmap size exceeds VM budget

私はいくつかの記事を読みました:

  1. java.lang.OutOfMemoryError: ビットマップ サイズが VM の予算を超えています - Android
  2. http://androidactivity.wordpress.com/2011/09/24/solution-for-outofmemoryerror-bitmap-size-exceeds-vm-budget/
  3. http://android-developers.blogspot.de/2009/01/voiding-memory-leaks.html

しかし、それでも私の問題は解決しません。

私のコードは次のとおりです。

public class MyActivity extends Activity {
    private Bitmap image;
    private ImageView imageView;
    private Button button;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        this.button = (Button) findViewById(R.id.button);
        this.imageView = (ImageView) findViewById(R.id.image);


        this.image = BitmapFactory.decodeResource(getResources(), R.drawable.m0);
        this.imageView.setImageBitmap(image);

        this.button.setOnClickListener(new View.OnClickListener() {
            private int current = 0;

            @Override
            public void onClick(View view) {
                Bitmap toRemove = image;
                Matrix matrix = new Matrix();
                matrix.setRotate(30, 0.5f, 0.5f);
                image = Bitmap.createBitmap(image, 0, 0, image.getWidth(), image.getHeight(), matrix, true);
                imageView.setImageBitmap(image);

                if (toRemove != null) {
                    toRemove.recycle();
                }
            }
        });
    }
}

toRemove.recycle()削除するイメージで呼び出したことがわかります。でも効果はないようです。


アップデート:

5回目(1回目ではない)にボタンをクリックしたときにのみエラーが発生したため、画像サイズに問題はありません。私のコードでは、新しいイメージを生成した後に古いイメージをリリースしようとしたため、古いイメージが適切にリリースされていないと思います。

を呼び出しtoRemove.recycle()ました。イメージをリリースする正しい方法ですか? それとも他のものを使用しますか?


最後に:

エミール そうです。サイズをログに記録するコードをいくつか追加しました。毎回増加していることがわかります。

08-28 13:49:21.162: INFO/image size before(2238): 330 x 320
08-28 13:49:21.232: INFO/image size after(2238): 446 x 442
08-28 13:49:31.732: INFO/image size before(2238): 446 x 442
08-28 13:49:31.832: INFO/image size after(2238): 607 x 606
08-28 13:49:34.622: INFO/image size before(2238): 607 x 606
08-28 13:49:34.772: INFO/image size after(2238): 829 x 828
08-28 13:49:37.153: INFO/image size before(2238): 829 x 828
08-28 13:49:37.393: INFO/image size after(2238): 1132 x 1132
4

1 に答える 1

2

Bitmap.createBitmap() がどのように機能するかはよくわかりませんが、エラーが「ビットマップサイズ」に関係していることを考えると

java.lang.OutOfMemoryError: bitmap size exceeds VM budget

クリックするたびに画像のサイズが大きくなっていると思います。したがって、5回目のクリックでエラーが発生します。

サイズの増加は、回転行列に関係していることをお勧めします。画像を回転すると、回転した画像が画像の幅と高さに切り抜かれているのではなく、画像のサイズが大きくなっているように見えます。

希望する w/h 境界内で回転を操作するには、いくつかの代替方法を試す必要があります。

この質問に対する答え (2 つ下) は、必要に応じて回転した画像をトリミングする方法を示しています。 Android: 中心点でビットマップを回転する方法

RectF rectF = new RectF(0, 0, source.getWidth(), source.getHeight());
matrix.mapRect(rectF);
于 2012-08-28T14:04:13.917 に答える