在把图片转化为bitmap时,遇到大一些的图片,我们经常会遇到OOM(Out Of Memory)的问题。因此需要把图片进行缩放。

Options

这就用到了我们上面提到的BitmapFactory.Options这个类,下面逐一介绍Options的参数

Options.inJustDecodeBounds

BitmapFactory.Options这个类,有一个字段叫做 inJustDecodeBounds ,如果我们把它设为true,那么BitmapFactory.decodeFile(String path, Options opt)并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你,这样就不会占用太多的内存,也就不会那么频繁的发生OOM了。
 
 如果我们把它设为true,那么BitmapFactory.decodeFile(String path, Options opt)并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你,这样就不会占用太多的内存,也就不会那么频繁的发生OOM了。
 

BitmapFactory.Options options = new BitmapFactory.Options();  

options.inJustDecodeBounds = true;  

Bitmap bmp = BitmapFactory.decodeFile(path, options);/* 这里返回的bmp是null */

之后,options.outWidth 和 options.outHeight就是我们想要的宽和高了。可以根据需要进行图片的缩略,在文章最后附上图片缩放代码

Options.inSampleSize

图片的缩放比例,该参数需要自己通过计算得到,一般通过options.outHeight和 options. outWidth获取的宽高和自己想要到得图片宽高计算出缩放比例。下面会给出缩放代码

为了节约内存我们还可以使用下面的几个字段:

options.inDither=false;    /*不进行图片抖动处理*/  
options.inPreferredConfig=null;  /*设置让解码器以最佳方式解码*/  

/* 下面两个字段需要组合使用 */  

options.inPurgeable = true;  

options.inInputShareable = true;

BitmapFactory的一些方法

这些方法可以用于从不同的数据源解析、创建Bitmap对象

  1. BitmapFactory.decodeByteArray(byte[] data, int offset, int length)
    从指定字节数组的offset位置开始,将长度为length的字节数据解析成Bitmap对象
  2. BitmapFactory.decodeFile(String path)
       该方法将指定路径的图片转成Bitmap,
     
  3. BitmapFactory.decodeFile(String path, Options options)
       该方法使用options的变量信息,将指定路径的图片转成Bitmap
  4. decodeResource()
      可以将/res/drawable/内预先存入的图片转换成Bitmap对象
  1. decodeStream()
      方法可以将InputStream对象转换成Bitmap对象。

图片缩放代码:

private Bitmap decodeThumbBitmapForFile(String path, int viewWidth, int viewHeight){
        BitmapFactory.Options options = new BitmapFactory.Options();
        //设置为true,表示解析Bitmap对象,该对象不占内存
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, options);
        //设置缩放比例
        options.inSampleSize = computeScale(options, viewWidth, viewHeight);

        //设置为false,解析Bitmap对象加入到内存中
        options.inJustDecodeBounds = false;
        Log.e(TAG, "get Iamge form file,  path = " + path);
        //返回Bitmap对象
        return BitmapFactory.decodeFile(path, options);
    }

computeScale() 计算缩放比例:

private int computeScale(BitmapFactory.Options options, int viewWidth, int viewHeight){
        int inSampleSize = 1;
        if(viewWidth == 0 || viewWidth == 0){
            return inSampleSize;
        }
        int bitmapWidth = options.outWidth;
        int bitmapHeight = options.outHeight;

       //假如Bitmap的宽度或高度大于我们设定图片的View的宽高,则计算缩放比例
        if(bitmapWidth > viewWidth || bitmapHeight > viewWidth){
            int widthScale = Math.round((float) bitmapWidth / (float) viewWidth);
            int heightScale = Math.round((float) bitmapHeight / (float) viewWidth);

        //为了保证图片不缩放变形,我们取宽高比例最小的那个
            inSampleSize = widthScale < heightScale ? widthScale : heightScale;
        }
        return inSampleSize;
    }