您的位置:首页 > 其它

(转)根据ImageView的大小来压缩Bitmap,避免OOM

2016-01-05 21:40 405 查看
本文转载于:/article/4877560.html

Bitmap是引起OOM的罪魁祸首之一,当我们从网络上下载图片的时候无法知道网络图片的准确大小,所以为了节约内存,一般会在服务器上缓存一个缩略图,提升下载速度。除此之外,我们还可以在本地显示图片前将图片进行压缩,使其完全符合imageview的大小,这样就不会浪费内存了。

一、思路

思路:计算出要显示bitmap的imageview大小,根据imageview的大小压缩bitmap,最终让bitmap和imageview一样大。

二、获得ImageView的宽高

int android.view.View.getWidth() // 返回:The width of your view, in pixels.
int android.view.View.getWidth() // 返回:The height of your view, in pixels.
通过这两个方法我就能得到imageview实际的大小了,单位是pix。这个方法请在imageview加载完毕后再调用,否则一致返回空。如果你不知道什么时候会加载完毕,你可以将其放入view.post方法中。

View Code

5.2 java代码

public void butonListener(View v) {
switch (v.getId()) {
case R.id.original_button:
loadBitmap(false); // 加载原图
break;

case R.id.clip_button:
loadBitmap(true); // 加载缩略图
break;
}
}

public void loadBitmap(boolean exactable) {
int bmSize = 0;
Bitmap bm = null;
if (exactable) {
// 通过工具类来产生一个符合ImageView的缩略图,因为ImageView的大小是50x50,所以这里得到的缩略图也应该是一样大小的
bm = BitmapUtils.decodeSampledBitmapFromResource(getResources(), R.drawable.saber, iv.getWidth(), iv.getHeight());
} else {
// 直接加载原图
bm = BitmapFactory.decodeResource(getResources(), R.drawable.saber);
}
iv.setImageBitmap(bm);
bmSize += bm.getByteCount(); // 得到bitmap的大小
int kb = bmSize / 1024;
int mb = kb / 1024;
Toast.makeText(this, "bitmap size = " + mb + "MB" + kb + "KB", Toast.LENGTH_LONG).show();
}


根据点击不同的按钮,触发不同的方法,最终把得到的bitmap放入imageview,并且显示当前的bitmap大小。运行后可以发现,经过压缩算法得到的bitmap要小很多,更加节约内存。


结果:原图:1M+;缩略图:156kb。


注意:当你的imageview远远小于bitmap原图大小的时候这种压缩算法十分有效,但是如果的bitmap和imageview大小差不多,你会发现这个算法的作用就不那么明显了,而且不要认为用了压缩就永远不会出现OOM了。

PS:实际使用中我们的bitmap经常是大于imageview的,所以推荐采用此方法。

源码下载:http://download.csdn.net/detail/shark0017/8402227

参考自:
http://www.cnblogs.com/kobe8/p/3877125.html https://developer.android.com/training/displaying-bitmaps/load-bitmap.html http://stormzhang.com/android/2013/11/20/android-display-bitmaps-efficiently/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: