1

私は 168.2KB と 1991x1756 の PNG 画像を持っていて、それを using にインポートしようとしましBitmapBitmapFactory.decodeStream()。問題はOutOfMemoryErrorBitmapサイズが 13,657KB になってしまうことです。
私が理解していないのは、インポート後にファイルが非常に大きい理由と、これを軽減する方法です。
このOutOfMemoryError問題は、デコードされBitmapた画像で非常によく見られるようですが、修正する方法が見つかりません。何か案は?

Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, bitmapOptions);

E/AndroidRuntime(10744): java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=7815KB, Allocated=3279KB, Bitmap Size=13657KB)

4

2 に答える 2

4

png ファイルは高度に圧縮されているため、ディスク上のファイル サイズは、ファイルに含まれるすべてのデータがメモリに読み込まれる場合よりもはるかに小さくなります。
ビットマップは、すべてのピクセルが値で表される画像の非常に単純な表現です。この値のサイズは、現在の設定によって異なります (一般的なサイズである 32 ビット イメージ、16 ビット イメージ、または 8 ビット イメージについて聞いたことがあるかもしれません)。

ビットマップとして表される画像の実際のサイズを計算するには、ピクセル数を計算し、これに各ピクセルのビット数を掛ける必要があります。
画像は 1991x1756 ピクセル (合計3 496 196ピクセル) です。ARGB_8888 形式 (各カラー/アルファ チャンネルに 1 バイト = ピクセルあたり 4 バイト) を使用してビットマップを読み込むと、最終的に3 496 196 * 4 = 13 984 784バイトになります。

使用するバイト数/チャネルを減らすことで合計サイズを減らすことができます (たとえば、RGB_565)。ただし、イメージの品質も低下します。inSampleSizeより良いオプションは、画像のサイズを縮小するか、パラメーターを使用して画像をインポートしてBitmapFactory.Options、より小さい画像をロードすることです。

于 2012-04-14T19:45:46.320 に答える
1

PNG画像はかなり圧縮されていると思いますが、Androidのビットマップはピクセルあたり4バイト(ARGB)であるため、圧縮されていません。

したがって、1991 * 1756 *(4バイト)は約13657KBです

したがって、サイズを小さくするには、ビットマップオプションに小さい画像またはサンプルサイズのオプションを使用してみてください。

この投稿を見てください: Androidで適切なサイズのビットマップをデコードする

于 2012-04-14T19:43:02.413 に答える