[英]How to compress bitmap from 10mb image from camera to 300kb beforw setting to imageview in android
[英]android 495KB image taking 10MB of Heap size
我正在嘗試在尺寸為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;
}
謝謝阿亞茲·阿拉維
圖像文件加載到內存后將被解壓縮。 在5600 x 480像素和每像素32位的情況下,未壓縮的圖像幾乎可以精確到10 MB。
我的建議是將其切成較小的部分,然后僅加載您需要的部分。
5,600px * 480px * 4字節= 10,752,000字節,因此這不足為奇。
在“ 有效顯示位圖”一文中有一些很好的指導,以及關於SO討論好的解決方案的許多問題。
那么您期望什么? 圖像是5600 x 480像素,現在內存中的每個像素都需要32位(請給我指正)。 算一下,您就會知道為什么會出現問題。 您需要使用較小的圖像,或者將圖像切成一部分,並在需要時加載所需的部分,並丟棄不必要的部分。
我有一個類似的問題在這里討論: 重新啟動時,Android應用程序崩潰導致內存不足
這里也有關於主題和可能解決方案的長時間討論: 將圖像加載到Bitmap對象時出現內存不足問題
如果加載位圖並且具有高DPI屏幕分辨率,則BitmapFactory將自動縮放位圖。 我認為,在具有最大DPI值的設備上,它在兩個方向上都會縮放2倍。
這可以解釋一些意外的增加。 嘗試將圖像放在名為drawable-nodpi
文件夾drawable-nodpi
,它們將不會縮放。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.