Android Bitmap使用心得
2017-05-14 15:15
393 查看
Bitmap 在android开发的过程途中有很重要的地位
特别是在处理内存溢出问题上有着居住轻重的地位,可以说是居功至伟啊!
BitmapFactory.create的时候
ALPHA_8
表示8位Alpha位图,即A=8,一个像素点占用1个字节,它没有颜色,只有透明度
ARGB_4444
表示16位ARGB位图,即A=4,R=4,G=4,B=4,一个像素点占4+4+4+4=16位,2个字节
ARGB_8888
表示32位ARGB位图,即A=8,R=8,G=8,B=8,一个像素点占8+8+8+8=32位,4个字节
RGB_565
表示16位RGB位图,即R=5,G=6,B=5,它没有透明度,一个像素点占5+6+5=16位,2个字节,glide图形框架使用的默认就是这种方式,比较节省内存
在图形框架一般都是由三级缓存,其中内存缓存有两种方法:软引用、LRU算法
软引用这方面 面试的时候可能还会问:弱引用以及虚引用
LRU算法缓存,一般使用的链表进行缓存,如果元素会被使用到,那么就将这个链表放入头部,那么最不常用的元素 就被落在了底部 被删除的时候 就先删除底部
当LRU算法移除元素的 千万不要 手贱去调用bitmap的recycle方法,因为 你移除的时候调用他 不代表这个元素就没有被调用了,recycle方法是不可逆的,只是被标记了death状态
内存回收不会立即回收这个bitmap,而且recycle方法 官方也是不建议去调用 因为如果该bitmap没有被使用了,那么垃圾回收器会自动的清除该内存
图片压缩:图片压缩一般有三种方法
质量压缩
尺寸压缩
C/C++库区压缩
质量压缩
FileOutputStream os = new FileOutputStream(outPath);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
质量压缩
// Get bitmap through image path
BitmapFactory.Options newOpts = new BitmapFactory.Options();
newOpts.inJustDecodeBounds = false;
newOpts.inPurgeable = true;
newOpts.inInputShareable = true;
// Do not compress
newOpts.inSampleSize = 1;
newOpts.inPreferredConfig = Config.RGB_565;
return BitmapFactory.decodeFile(imgPath, newOpts);
我们一般是如何处理图片的Size这个重要的因素的呢?,当然是调整Bitmap的大小到适合的程度啦!辛亏在BitmapFactory中,我们可以很方便的通过BitmapFactory.Options中的options.inSampleSize去设置Bitmap的压缩比,官方给出的说法是
If set to a value > 1, requests the decoder to subsample the original image, returning a smaller image to save memory....For example, inSampleSize == 4 returns an image that is 1/4 the width/height of the original, and 1/16 the number of pixels. Any value
<= 1 is treated the same as 1.
也就是说设置inSampleSize的值之后,新的图片大小为原来大小1/(inSampleSize*inSampleSize);
底层库:
libjpeg
特别是在处理内存溢出问题上有着居住轻重的地位,可以说是居功至伟啊!
BitmapFactory.create的时候
ALPHA_8
表示8位Alpha位图,即A=8,一个像素点占用1个字节,它没有颜色,只有透明度
ARGB_4444
表示16位ARGB位图,即A=4,R=4,G=4,B=4,一个像素点占4+4+4+4=16位,2个字节
ARGB_8888
表示32位ARGB位图,即A=8,R=8,G=8,B=8,一个像素点占8+8+8+8=32位,4个字节
RGB_565
表示16位RGB位图,即R=5,G=6,B=5,它没有透明度,一个像素点占5+6+5=16位,2个字节,glide图形框架使用的默认就是这种方式,比较节省内存
在图形框架一般都是由三级缓存,其中内存缓存有两种方法:软引用、LRU算法
软引用这方面 面试的时候可能还会问:弱引用以及虚引用
LRU算法缓存,一般使用的链表进行缓存,如果元素会被使用到,那么就将这个链表放入头部,那么最不常用的元素 就被落在了底部 被删除的时候 就先删除底部
当LRU算法移除元素的 千万不要 手贱去调用bitmap的recycle方法,因为 你移除的时候调用他 不代表这个元素就没有被调用了,recycle方法是不可逆的,只是被标记了death状态
内存回收不会立即回收这个bitmap,而且recycle方法 官方也是不建议去调用 因为如果该bitmap没有被使用了,那么垃圾回收器会自动的清除该内存
图片压缩:图片压缩一般有三种方法
质量压缩
尺寸压缩
C/C++库区压缩
质量压缩
FileOutputStream os = new FileOutputStream(outPath);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
质量压缩
// Get bitmap through image path
BitmapFactory.Options newOpts = new BitmapFactory.Options();
newOpts.inJustDecodeBounds = false;
newOpts.inPurgeable = true;
newOpts.inInputShareable = true;
// Do not compress
newOpts.inSampleSize = 1;
newOpts.inPreferredConfig = Config.RGB_565;
return BitmapFactory.decodeFile(imgPath, newOpts);
我们一般是如何处理图片的Size这个重要的因素的呢?,当然是调整Bitmap的大小到适合的程度啦!辛亏在BitmapFactory中,我们可以很方便的通过BitmapFactory.Options中的options.inSampleSize去设置Bitmap的压缩比,官方给出的说法是
If set to a value > 1, requests the decoder to subsample the original image, returning a smaller image to save memory....For example, inSampleSize == 4 returns an image that is 1/4 the width/height of the original, and 1/16 the number of pixels. Any value
<= 1 is treated the same as 1.
也就是说设置inSampleSize的值之后,新的图片大小为原来大小1/(inSampleSize*inSampleSize);
底层库:
libjpeg
相关文章推荐
- 关于android 使用bitmap的OOM心得和解决方案
- Android之Bitmap使用心得(持续更新)
- 关于android 使用bitmap的OOM心得和解决方案
- 关于android 使用bitmap的OOM心得和解决方案
- 关于android 使用bitmap的OOM心得和解决方案
- 关于android 使用bitmap的OOM心得和解决方案
- 关于android 使用bitmap的OOM心得和解决方案
- 关于android 使用bitmap的OOM心得和解决方式
- 初学Android,图形图像之使用drawBitmapMesh扭曲图像(三十二)
- android开发之--ExpandableListView控件使用心得
- android之SQLite使用心得之一
- 分享Android平板电脑使用心得
- 解決在 Android 中使用 Bitmap 造成 Out of memory 的方法~
- android中使用BitmapFactory的decodeStream()方法解码图片失败问题
- android 学习心得---webview使用得到网页加载时间
- 举例说明android中Bitmap、ListView以及ImageView的综合使用---显示图片并获取图片的宽和高
- 转!Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- 转载 Android中使用BitmapFactory的decodeStream()方法解码图片失败问题
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- android之SQLite使用心得之二