Android Bitmap使用心得

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++库区压缩


质量压缩 

  1. FileOutputStream os = new FileOutputStream(outPath);  
  2.         bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
质量压缩


  1. // Get bitmap through image path  
  2.         BitmapFactory.Options newOpts = new BitmapFactory.Options();  
  3.         newOpts.inJustDecodeBounds = false;  
  4.         newOpts.inPurgeable = true;  
  5.         newOpts.inInputShareable = true;  
  6.         // Do not compress  
  7.         newOpts.inSampleSize = 1;  
  8.         newOpts.inPreferredConfig = Config.RGB_565;  
  9.         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








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值