Bitmap的高效加载

Bitmap在Android中指的的是一张图片,比如png、jpg等图片,通过BitmapFactory类的decodeFile、decodeResource、decodeStream和decodeByteArray方法可以分别从文件系统、资源、输入流、字节数组中加载出一个Bitmap对象,其中decodeFile和decodeResource是调用decodeStream实现的

通过BitmapFactory.Options来缩放图片

采样率inSampleSize,它的值代表边的缩放率,比如说2,代表边缩放1/2,则像素为原图的1/4,占用的内存也为原图的1/4,所以,通过设置BitmapFactory的采样率可以减少图片的所需内存,达到高效加载

使用流程:

1.     创建BitmapFactory.Options,并设置它的inJustDecodeBounds为true,表示只加载图片的宽高属性

2.     用这个BitmapFactory和Options去加载图片的宽高属性,会储存在Options里

3.     从Options中取出图片的宽高属性,它对应于outWidth/Height

4.     设定采样规则,根据采样规则来结合所需的图片大小计算出采样率inSampleSize,储存在Options里

5.     将Options的inJustDecodeBounds为false,表示要正常加载图片

6.     用BitmapFactory和储存有inSampleSize的Options去加载图片

代码如下:

 public static Bitmap decodeBitmapFromResource(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 = computeInSampleSize(options, reqWidth, reqHeight);
        //设置配置:关闭只加载位图的大小
        options.inJustDecodeBounds = false;
        //让工厂带着修改后的配置重新加载图片
        return BitmapFactory.decodeResource(res, resID, options);
    }

    public static int computeInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        //获得配置的外部属性,也就是图片的原始大小
        final int oldWidth = options.outWidth;
        final int oldHeight = options.outHeight;
        //初始化采样率为1,先从原图和需求的大小开始比较
        int inSampleSize = 1;
        int inSampleSizeW = oldWidth / reqWidth;
        int inSampleSizeH = oldHeight / reqHeight;

        if (inSampleSizeW > inSampleSizeH) {
            inSampleSize = inSampleSizeW;
        } else {
            inSampleSize = inSampleSizeH;
        }
        //得到最终的采样率
        return inSampleSize;

    }


剪裁方法(需要先获得Bitmap,所以并不是高效加载):

实现的思想就是使用Bitmap去创建新的Bitmap,具体一点就是通过目标宽高和原宽高的比例来创建一个矩阵,然后用矩阵来创建新的Bitmap

代码如下:

public static Bitmap ScaleBitmap(Bitmap bm, int reqWidth, int reqHeight) {

        // 得到图片原始的高宽
        int rawHeight = bm.getHeight();
        int rawWidth = bm.getWidth();

        // 设定图片新的高宽
        int newHeight = reqHeight;
        int newWidth = reqWidth;

        // 计算缩放因子
        float heightScale = ((float) newHeight) / rawHeight;
        float widthScale = ((float) newWidth) / rawWidth;

        // 新建立矩阵
        Matrix matrix = new Matrix();
        matrix.postScale(heightScale, widthScale);


        //将图片大小压缩
        //压缩后图片的宽和高以及kB大小均会变化
        Bitmap newBitmap = Bitmap.createBitmap(bm, 0, 0, rawWidth, rawHeight, matrix, true);

        return newBitmap;
    }


你可能感兴趣的:(自学后的总结)