Bitmap以及LRUCache

原创 2016年08月31日 11:54:11

Bitmap优化

Bitmap解码

-常见的jpg(有损压缩),png(无损压缩),webp(结合两者优点,android4.2之后支持)使图像的存储格式。

-Android中要显示图片必须先经过解码(decode)读取图像的数据到内存中。

-BitmapFactory提供了常用的一些decode方法。

-图片真正占用的内存大小要看decode之后的数据大小。
Bitmap解码耗时,最好放置异步线程


Bitmap复用

Bitmap复用工具–第三方库glide

//指向一个已经创建的对象mCurrentBitmap,解码新的bitmap就会复用其内存
    mBitmapOptions.inBitmap=mCurrentBitmap; 
    mCurrentBitmap=BitmapFactory.decodeFile(filename,mBitmapOptions);

Bitmap缩放

  • 按比例缩放
 //缩放到指定的大小
 //从一个inBmap获取指定大小的Bitmap
    createScaledBitmap(inBmp,64,128);
//缩放到原图的1/4
    mBitmapOptions.inSampleSize=4;
    mCurrentBitmap=BitmapFactory.decodeFile(fileName,mBitmapOptions);
//缩放为(int)dstWidth/srcWidth
    mBitmapOptions.inScaled=true;
    mBitmapOptions.inDensity=srcWidth;
    mBitmapOptions.inTargetDensity=dstWidth;
    mCurrentBitmap=BitmapFactory.decodeResources(getResources(),mImageId,mBitmapOptions);
//先缩放为1/4,再缩放(int)dstWidth*4/srcWidth
//这种缩放效率会很快
    mBitmapOptions.inScaled=true;
    mBitmapOptions.inSampleSize=4;
    mBitmapOptions.inDensity=srcWidth;
    mBitmapOptions.inTargetDensity=dstWidth*mBitmapOptions.inSampleSize;
    mCurrentBitmap=BitmapFactory.decodeFile(fileName,mBitmapOptions);
  • 不加载图片至内存就获取原图的宽和高
    mBitmapOptions.inJustDecodeBounds=true;
    BitmapFactory.decodeFile(fileName,mBitmapOptions);
    srcWidth =  mBitmapOptions.outWidth;
    srcHeight= mBitmapOptions.outHeight;
     public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,int reqWidth, int reqHeight) {
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, resId, options);
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource(res, resId, options);
    }
 ```
 ```
 //计算inSampleSize
  public static int calculateInSampleSize(BitmapFactory.Options options,
            int reqWidth, int reqHeight) {       
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
        if (height > reqHeight || width > reqWidth) {
            if (width > height) {
                inSampleSize = Math.round((float) height / (float) reqHeight);
            } else {
                inSampleSize = Math.round((float) width / (float) reqWidth);
            }           
            final float totalPixels = width * height;    
            final float totalReqPixelsCap = reqWidth * reqHeight * 2;
            while (totalPixels / (inSampleSize * inSampleSize) > totalReqPixelsCap) {
                inSampleSize++;
            }
        }
        return inSampleSize;
    }
}

Bitmap减小占用字节

A:透明度 R:红色 G:绿 B:蓝
Bitmap.Config ARGB_4444:每个像素占四位,共16位
Bitmap.Config ARGB_8888:每个像素占四位,共32位
Bitmap.Config RGB_565:每个像素占四位,共16位
Bitmap.Config ALPHA_8:每个像素占四位,只有透明度,没有颜色。

 //设置图片像素格式
    BitmapFactory.Options options = new BitmapFactory.Options();
  // 默认是Bitmap.Config.ARGB_8888
    options.inPreferredConfig = Bitmap.Config.ARGB_4444;  
    BitmapFactory.decodeResources(getResources(),mImgId,options);

LRU cache

  • 初始化
    ActivityManager am=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
    int  availMernlnBytes=am.getMemoryClass()*1024*1024;
    LruCache bitmapCache=new LruCache<String,Bitmap>(availMernlnBytes/8);     
  • 指定插入数据的大小
    public class ThumbnailCache extends LruCache(String,Bitmap){
    @Override
    protected int sizeOf(String key,Bitmap value){
    return value.getByteCount();
    }
 }
  • 实现
    Bitmap map=mCache.get(fileName);
        if(map==null){
        map=BitmapFactory.decodeFile(fileName);
        mCache.put(fileName,map);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Bitmap——内存缓存LruCache实现原理

转自http://www.cnblogs.com/liuling/archive/2015/09/24/2015-9-24-1.html 三级缓存 内存-文件-网络,  也就是加载图片的时候首先从...

Bitmap的高效加载和LruCache缓存

Bitmap高效加载Android应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常。 查看每个应用程序的最最高可用内存:int maxMemory = ...

Android中Bitmap的加载和Cache(三级缓存 :LruCache,DiskLruCache)学习笔记

Android设备作为客服端,最明显的特点就是:将服务端数据按照某种格式展示给Android用户。图片又是其中最重要的数据加载格式,所以对图片加载和缓存的学习和掌握是一个Android开发人员必备的基...

Bitmap.Options和LruCache——Android高效加载大图、多图解决方案,有效避免程序OOM

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9316683 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加...

Bitmap的缓存(LruCache,DiskLruCache)

1、使用内存缓存(Use a Memory Cache)//首先在onCreate方法里创建LruCache对象,并分配空间 private LruCache mMemoryCache;@Overri...

LruCache图片批量加载

  • 2017年06月14日 16:04
  • 43.89MB
  • 下载

Android 缓存浅谈(一) LruCache

Android应用开发好多场景都是手机和web服务器之间进行通信,从服务端需要获取数据,但是当访问的数据比较大,比较多,并且是重复数据时,会极大影响性能,甚至应用崩溃,手机卡死,这时候就要考虑缓存机制...

LruCache缓存网络图片

  • 2016年08月27日 16:57
  • 444KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Bitmap以及LRUCache
举报原因:
原因补充:

(最多只允许输入30个字)