2012-07-06 47 views
1

我想在我的應用程序中加載一個圖像大小爲495KB。如果我加載的圖像比堆大小從25MB增加到35MB,這在我的應用程序中導致真正的內存問題。如果我不加載這個圖像比堆大小保持在25MB。任何人都可以告訴它爲什麼要佔用這麼大的堆大小?android 495KB圖像佔用10MB堆大小

圖片下面,我使用加載圖像 enter image description here

守則

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; 
} 

感謝 阿亞茲阿拉維

回答

0

BitmapFactory將自動擴展您的位圖,如果你裝回,具有較高的DPI屏幕分辨率。我認爲在DPI值最大的設備上,它會在兩個方向上縮放2倍。

這可能可以解釋一些意想不到的增加。嘗試將您的圖片放在名爲drawable-nodpi的文件夾中,它們不會被縮放。

+0

如何從該文件夾而不是從drawable-hdpi中選擇圖像? – 2012-07-06 07:24:29

+0

我從hdpi文件夾中刪除文件並將其放入nodpi文件夾中。儘管堆大小減小,但圖像加載不正確。 – 2012-07-06 07:44:40

+0

哦,我假設你把它放在'可繪製的 – Tim 2012-07-06 16:48:33

5

圖像文件在加載到內存時未壓縮。在5600 x 480像素和32像素/像素的情況下,未壓縮時,您的圖像幾乎可以達到10 MB。

我的建議是將它切成更小的部分,只加載你需要的部分。

+0

如果我刪除中間的一些花會導致任何改變?我必須使用完整的圖像作爲一個。 – 2012-07-06 07:25:05

+0

所使用的內存量與圖像的像素大小成正比,因此您要減小的任何內容都將直接減少內存消耗。 (更改內容不會有幫助) – grahamparks 2012-07-06 07:48:23

1

那你期待什麼?圖像是5600 x 480像素,現在在內存每一個像素需要32位(PLZ糾正我的人)。做數學,你會明白爲什麼它是一個問題。您需要使用較小的圖像,或者將圖像分成幾部分,並在需要時加載所需的部分,並丟棄不必要的部分。

我這是在這裏討論了類似的問題:Android app crash out of memory on relaunch

還有關於主題和可能的解決方案在這裏長時間的討論:Strange out of memory issue while loading an image to a Bitmap object

2

5,600px * 480個像素* 4個字節= 10752000個字節,所以這並不奇怪。

Displaying Bitmaps Efficiently article有一些很好的指導,以及在這裏討論好的解決方案的幾個問題。

+0

如果刪除其中的一些花朵並將圖像尺寸保持爲5600 * 480,內存消耗是否會相同? – 2012-07-06 07:26:58

+0

我有什麼替代解決方案? – 2012-07-06 07:27:48

+0

@AyazAlavi無論像素值是否解壓縮都無關緊要,這就是我們正在談論的內容。所以不行,去除花朵並保持相同的尺寸不會有任何區別。然而,我指出的鏈接有一個名爲「高效加載大型位圖」的課程,它非常好地解釋了一些事情,這比我在這裏能夠公正的做法更好。 – 2012-07-06 07:30:20