Bitmap和LruCache

来源:互联网 发布:windows pe 知乎 编辑:程序博客网 时间:2024/06/06 07:31

一,Bitmap

1.什么是bitmap
Bitmap表示的是一张图片,这个图片是原图。BitmapFactory的四个方法:decodeFile, decodeResource, decodeStream,decodeByteArray,分别用于支持从文件系统,资源,输入流,和字节数组中生成一个bitmap对象。

2.bitmap占据的内存大小
以一张512 * 512分辨率,采用ARGB8888格式存储的图片为例,它占用的内存大小 = 512 * 512 4 byte.。其中512 512表示这张图片的宽和高都是512个像素,采用ARGB8888格式存储表示图片的每个像素所占据的内存大小(不是图片在磁盘上文件大小)为4 * 8bit = 4byte。ARGB8888表示每个通道用8位2进制来表示,这里有四个通道即32位2进制,一个字节是8位,所以共4个字节

3.bitmap的压缩
压缩会将原图的尺寸缩小,所占据的内存空间也会缩小,android中对图片的压缩主要是会用到BitmapFactory.options内部类的inSampleSize属性,这个属性,代表采样率,以一张1024 * 1024采用ARGB8888格式存储的图片来说,当采样率inSampleSize = 2时,这张图片的宽和高都变成原来的1/2,即变成了512 * 512大小,宽和高都变成了原来的1/2,所占据的内存大小则变为了原来的1/4。官方文档建议外界传递给系统的inSampleSize应该为2的指数。比如ImageView的大小为100 * 100像素,而原始图片的大小为200 * 300,我们应该采用多大的采样率才能使图片式样ImageView的大小呢。200/100 = 2, 300/100 = 3,如果采样率为2那么采样之后的图片尺寸为100 * 150,这是适合IMageView的,如果采样率为3,采样之后的图片尺寸为200/3 * 100,这样图片在ImageView中显示的时候会有明显的拉伸效果

private int caculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight){        int height = options.outHeight;        int width = options.outWidth;        int inSampleSize = 1;        //目的是为了让inSampleSize为2的指数        if (height > reqHeight || width > reqWidth){            int halfHeight = height / 2;            int halfWidth = width / 2;            while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth){                inSampleSize *= 2;            }        }        return inSampleSize;    }

二,LruCache

缓存

三级缓存:网络缓存,本地缓存,内存缓存。
如果内存中没有就从本地区获取,如果本没有在去网络上获取,这样可以节省流量,提高用户的体验,

我们创建的对象都是会在内存中分配存储空间的,对象里面的数据就是存储在内存当中的,内存缓存就是这个。既然将数据存储存储在对象中就将数据存储在内存中了,那我们为什么还要用到LruCache呢,以Map为例,我们不断调用map.put()方法,那么所占据的内存就会不断增加,android系统为模拟器分配的内存空间为16M,Java中引用都是强引用,垃圾回收不会回收,所以出现内存不足的情况,而LruCache(Least Recently Used)内部也采用了LinkedHashMap,只是说当内存满的时候,会将之前的数据移除出去,最近使用的会被添加到map中去。

//获取系统为该应用分配的最大内存的1/8作为缓存区        long maxMemory = Runtime.getRuntime().maxMemory()/8;//模拟器默认是16M        mMemoryCache = new LruCache<String,Bitmap>((int) maxMemory){            @Override            protected int sizeOf(String key, Bitmap value) {                /*                 * public final int getByteCount(){                 *      return getRowBytes() * getHeight();                 * }                 *///              return value.getByteCount();这在API12及其以上才能用                return value.getRowBytes() * value.getHeight();            }        };
0 0
原创粉丝点击