1

サイズが 495KB の画像をアプリに読み込もうとしています。このイメージをロードすると、ヒープ サイズが 25MB から 35MB に増加し、アプリで実際のメモリの問題が発生します。このイメージをロードしない場合、ヒープ サイズは 25MB のままです。なぜそんなに多くのヒープサイズを取っているのか誰にもわかりますか?

画像は以下です ここに画像の説明を入力

画像をロードするために使用しているコードは

    InputStream s4 = getResources().openRawResource(R.drawable.parallax_layer4);    
    FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
    System.gc();
    if(bitmap4 != null) {
        bitmap4.recycle();
    }
    s3 = null;
    System.gc();     

    bitmap4 = bitmap(s4);
    layer4Back = new ImageView(this);
    layer4Back.setImageBitmap(bitmap4);
    layer4Back.setScaleType(ScaleType.FIT_XY);
    parallaxLayout.addView(layer4Back, 3, lp);
    try {
        s4.close();
    } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
    }
    s4 = null;
    System.gc();

private static Bitmap bitmap(final InputStream is) {
    Bitmap bitmap = null;
    System.gc();
    Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.RGB_565;
    options.inSampleSize = 1; 

    try {
       // bitmap = BitmapFactory.decodeStream(is);
       bitmap = BitmapFactory.decodeStream(is, null, options);

    } catch (Error e) {
       // TODO: handle exception
       e.printStackTrace();
    }
    return bitmap;
}

ありがとうアヤズ・アラヴィ

4

4 に答える 4

5

イメージファイルは、メモリにロードされるときに圧縮解除されます。5600 x 480ピクセルおよび32ビット/ピクセルの場合、非圧縮の場合、画像はほぼ正確に10MBになります。

私の推奨は、それをより小さなセクションに分割し、必要なセクションのみをロードすることです。

于 2012-07-06T07:18:15.377 に答える
2

5,600px * 480px *4バイト=10,752,000バイトなので、これは驚くべきことではありません。

「ビットマップを効率的に表示する」の記事にはいくつかの優れたガイダンスがあり、SOに関するかなりの数の質問が優れたソリューションについて説明しています。

于 2012-07-06T07:19:15.607 に答える
1

さて、あなたは何を期待しましたか?画像は5600x480ピクセルで、メモリ内ではすべてのピクセルが32ビットを使用します(plzは誰かを修正します)。数学を行うと、それが問題である理由がわかります。小さい画像を使用するか、画像を部分的に切り取って、必要なときに必要な部分をロードし、不要な部分を破棄する必要があります。

私はここで議論されている同様の問題を抱えていました:Androidアプリが再起動時にメモリからクラッシュします

ここには、主題と考えられる解決策についての長い議論もあります。ビットマップオブジェクトに画像をロードする際のメモリ不足の問題

于 2012-07-06T07:19:09.213 に答える
0

BitmapFactory は、ビットマップを読み込んで DPI の画面解像度が高い場合、ビットマップを自動スケーリングします。最大の DPI 値を持つデバイスでは、両方向に 2 倍にスケーリングされると思います。

これは、予想外の増加の一部を説明する可能性があります。というフォルダーに画像を入れてみてください。画像はdrawable-nodpiスケーリングされません。

于 2012-07-06T07:16:49.723 に答える