在把图片转化为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对象
- BitmapFactory.decodeByteArray(byte[] data, int offset, int length)
从指定字节数组的offset位置开始,将长度为length的字节数据解析成Bitmap对象 - BitmapFactory.decodeFile(String path)
该方法将指定路径的图片转成Bitmap,
- BitmapFactory.decodeFile(String path, Options options)
该方法使用options的变量信息,将指定路径的图片转成Bitmap - decodeResource()
可以将/res/drawable/内预先存入的图片转换成Bitmap对象
- 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;
}