3

ディスクに 1280x1280 の JPG があり、次のコードを使用してイメージの領域をデコードし (側面を切り取って)、ImageView に表示しています。画像の上部と下部のクリッピングにも同様の問題があります。

private Bitmap decodeBitmapRegion(InputStream in, Rect region, Bitmap recycleBitmap) {
    LOGD(TAG, "decodeBitmapRegion region=" + region + ", recycleBitmap=" + recycleBitmap );

    Bitmap bitmap = null;
    BitmapRegionDecoder decoder = null;

    BitmapFactory.Options options = new BitmapFactory.Options();        
    options.inSampleSize = 1;
    options.inBitmap = recycleBitmap;

    try {
        decoder = BitmapRegionDecoder.newInstance(in, false);
        bitmap = decoder.decodeRegion(region, options);
    } catch (IllegalArgumentException e){
        LOGE(TAG, "Failed to recycle bitmap for rect=" + region, e);
    } catch (IOException e) {
        LOGE(TAG, "Failed to decode into rect=" + region, e);
    } finally {
        if (decoder != null) decoder.recycle();
    }

    return bitmap;
}

Acer Iconia A100 (4.0.3) では、コードは完全に機能し、提供されている場合はリージョンをリサイクル ビットマップにデコードし、ヒープにメモリを割り当てません。logcat には GC またはグロー ヒープ メッセージはありません。4.2.0 を実行している Nexus 7 でも正しく動作しています。

Motorola Xoom (4.0.4) では、コードは次の logcat を生成します。最初の dalvikvm-heap grow (4738256 バイト) はおそらく BitmapRegionDecoder のデータ用であり、2 番目 (3603216 バイト) はイメージ (800x1126x4) を格納するために必要なメモリ量と一致します。スキーエラーもあります。

  8522    LocationImageLoader  D  decodeBitmapRegion region=Rect(240, 77 - 1040, 1203), recycleBitmap=android.graphics.Bitmap@415319a8
  8522               dalvikvm  D  GC_FOR_ALLOC freed 8213K, 28% free 22782K/31623K, paused 34ms
  8522          dalvikvm-heap  I  Grow heap (frag case) to 26.808MB for 4738256-byte allocation
  8522               dalvikvm  D  GC_CONCURRENT freed 6K, 14% free 27403K/31623K, paused 3ms+7ms
  8522                   skia  D  WARNING: One-shot allocator has already allocated (alloc count = 1)
  8522               dalvikvm  D  GC_FOR_ALLOC freed 0K, 14% free 27403K/31623K, paused 33ms
  8522          dalvikvm-heap  I  Grow heap (frag case) to 30.238MB for 3603216-byte allocation
  8522               dalvikvm  D  GC_FOR_ALLOC freed 0K, 3% free 30922K/31623K, paused 41ms

設定 options.inPreferredConfig = Bitmap.Config.RGB_565; ビットマップが正しくリサイクルされているかのように、Xoom での 2 番目の割り当てを無効にしているように見えますが、デコーダーに割り当てられたメモリがまだ残っています。

完全なイメージ (1280x1280) と BitmapFactory を使用したリサイクルは機能しますが、完全なイメージを格納するために、領域で必要とされるよりもはるかに多くのメモリが使用されます。

なぜ Xoom が動作しないのか理解できませんが、両方とも Android 4.0.x を実行している場合、Acer は問題ありません。

4

2 に答える 2

2

Archos G9 80(4.0.4)で、RGB656をリクエストしたにもかかわらず、返されたビットマップがRGB8888を使用していることに気づきました。1024x1024の正方形をデコードし、結果のビットマップでgetByteCount()を呼び出すと、4MBが返されます。RGB8888を使用してビットマップを渡しても、新しいビットマップが割り当てられます。

ドキュメントに注意すると、オプションはinSampleSizeに使用されているように見えますが、inPreferredConfigとinBitmapの使用については特に言及されていません。これは、inPreferredConfigとinBitmapを尊重することはメーカー次第であるか、4.1以降で追加されたことを意味すると思います。

于 2012-12-14T03:32:15.977 に答える