Android 图片缩放 BitmapFactory详解

来源:互联网 发布:中国移动宽带网络测速 编辑:程序博客网 时间:2024/05/17 06:23

参考:android之BitmapFactory.Options的使用

 
在把图片转化为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;    }
1 0
原创粉丝点击