1

アプリで使用したい.pngファイルがあります。この画像はかなり大きく、約328x32765ピクセル、サイズ751KBで、私のresフォルダーにあります。この画像をレイアウトに設定しようとすると、「java.lang.OutOfMemoryError:ビットマップサイズがVMバジェットを超えています」というエラーメッセージが表示されます。

関連性があるかどうかはわかりませんが、同じページに約730個のボタンがあり、ロードして正常に機能しますが、これらのボタンも大量のメモリを使用しているのではないかと思います。

いずれにせよ、この問題を解決したり、.png画像のメモリ使用量を減らしたりするための簡単な修正はありますか?

4

3 に答える 3

2

ビットマップに関してAndroidのサイト自体からのチュートリアルで述べられているように、ビットマップは多くのメモリを消費します

ビットマップの表示

編集:

関数「Bitmap.createScaledBitmap(Bitmap、width、height、filter);」を使用してみてください。または、チュートリアルで説明されているように、「BitmapFactory.Options」クラスを使用してみてください。

「BitmapFactory.Options」クラスは、その関数自体が、ロードされたビットマップをキャッシュすることにより、開発者がビットマップをロードする際のVMの使用を最小限に抑えるのに役立つため、非常に役立ちます。

于 2012-10-04T02:33:11.323 に答える
0

画像のサイズは731KBですが、実際の膨らんだビットマップサイズは約41メガバイトになります。デバイスが一度に41MBを割り当てることができないため、エラーが発生します。

残念ながら、画像の縮小バージョンをロードする以外に、これを解決する他の方法はありません。

Bitmap.Optionsクラスを使用して、スケーリングされた係数を指定します。

2-各辺を2倍小さくすることを意味します

3-3倍小さい、.....。

x-x倍小さい

良いニュースは、結果として膨らんだビットマップサイズが41 /(x * x)MBになることです。

2-41/4 = 10.25MB

3-41/9 = 4.5MB

4-41/16 =2.6MB....。

これを試して、複数のデバイスでテストしてください。

または、画像をかなり小さい画像に分割し、境界線や仕切りのないListViewを使用して、滑らかな画像が表示されるようにしますが、ListViewは、必要に応じて断片の開始と破棄も行います。(ListViewは垂直方向にのみスクロールするため、水平方向のスクロール機能が失われることに注意してください。これが問題になる場合に備えて)。

于 2012-10-04T04:09:04.817 に答える
0

Androidは大きなビットマップを処理できませんOOMエラーが発生します。これは多くの開発者が直面する大きな問題です。a=予期しないエラーではありません。OOMエラーについて説明している多くのドキュメントをグーグルで検索してみてください。アプリケーションの開発中にも苦労しました。これを取り除くと、大きな画像をサンプリングすることが唯一の方法です。

   int scale = "Image byte length" / 320000;
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = scale / 2 + scale % 2* 2;
   decryptedimage=BitmapFactory.decodeByteArray(decryptedData,0,decryptedData.length,options);
于 2012-10-04T04:09:20.090 に答える