0

Android アプリケーションにアルバム アートのサポートを追加したところ、アルバム アートをレイアウトで表示するとアプリケーションのメモリが急増し、再生サービスが最終的に強制終了されてメモリが解放されるという問題が発生しました。問題は、抽出したアルバム アートを圧縮せずにレイアウトに追加していることだと思います。これにより、大きな画像をメモリにキャッシュする必要があります。ビットマップを作成するために使用しているコードは次のとおりです。

byte [] blob = mCursor.getBlob(mCursor.getColumnIndexOrThrow(Media.MediaColumns.PICTURE));

if (blob != null) {
    return BitmapFactory.decodeByteArray(blob, 0, blob.length);
}

これらのビットマップを均一にスケーリング/圧縮して、メモリフットプリントを削減することは可能ですか? また、バイト配列(入力ストリームではなく)を使用して直接圧縮する方法はありますか。

4

1 に答える 1

3

これを試して

Options opt = new Options();
        opt.inSampleSize = 2;
        if (blob != null) {
        return  BitmapFactory.decodeByteArray(blob, 0, length, opt)
          }

これに関する詳細情報

public int inSampleSize
Added in API level 1

1 より大きい値に設定すると、メモリを節約するために小さいイメージを返し、元のイメージをサブサンプリングするようにデコーダに要求します。サンプル サイズは、デコードされたビットマップ内の 1 つのピクセルに対応する、いずれかの次元のピクセル数です。たとえば、inSampleSize == 4 は、元の幅/高さが 1/4、ピクセル数が 1/16 のイメージを返します。任意の値 <= 1 は 1 と同じように扱われます。注: デコーダーはこの要求を実行しようとしますが、結果のビットマップは、正確に要求されたものとは異なる次元になる場合があります。また、2 の累乗は、多くの場合、デコーダーが優先するために高速/簡単です。

于 2012-12-08T17:56:31.757 に答える