(转)根据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代码
根据点击不同的按钮,触发不同的方法,最终把得到的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/
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/
相关文章推荐
- python统计程序运行时间函数
- 厌倦了NullPointException?Optional拯救你
- 深入分析JavaWeb Item44 -- Struts2开发核心之动作类Action
- 移除空文件夹RemoveDirectory
- Unity中实现3D物体跳跃
- bzoj3907: 网格
- BZOJ1901 Zju2112 Dynamic Rankings
- 计算UIBezierPath 路径内、路径上的点
- Linux权限设置详解
- db2中的fetch first n rows only与 oracle中的rownum
- 技术工程师成长之其中一道
- Pascal经典例题
- HDOJ1004
- groovy : 正則表達式
- Threading Module源码概述(一)
- SOA基础
- java项目中常用的分页对象Page
- AJAX个人理解
- Linux中断(interrupt)子系统之四:驱动程序接口层 & 中断通用逻辑层
- Easy-Ui错误之SyntaxError: function statement requires a name解决办法