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