您的位置:首页 > 移动开发 > Android开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: