更高效的Bitmap压缩

看到这个标题是不是有点懵?为什么叫更高效的Bitmap压缩?因为我在前面已经说过了一种图片压缩方法,它是通过bitmap.compress()方法来进行循环压缩,没什么毛病,但比较啰嗦,而且是有限制的,我们无法压缩成自己想要的大小。

BitmapFactory有个内部类叫Options,中文翻译叫选择,咱不管它为啥这么叫(因为我也不知道),知道用法就行了。在Options中我们会使用到两个属性,一个是inJustDecodeBounds,这个是boolean类型,另一个是inJustDecodeBounds,这个是int类型。我们在代码中再解释其中的意思。

ok,看代码.

//开始压缩

BitmapFactory.Options options =newBitmapFactory.Options();

options.inJustDecodeBounds=true;

BitmapFactory.decodeResource(getResources(),R.drawable.ss,options);

intoutHeight = options.outHeight;

intoutWidth = options.outWidth;

int height =128;

int width =128;

intz =1;

if(outHeight>height&&outWidth>width){

outHeight = outHeight/2;

outWidth = outWidth/2;

while(outHeight>height && outWidth>width){

outHeight = outHeight/2;

outWidth = outWidth/2;

z = z*2;

}

}

options.inSampleSize= z;

Log.d("徐会闯",z+"");

options.inJustDecodeBounds=false;

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ss,options);

代码没几行,我们首先引用BitmapFactory.Options的对象,设置inJustDecodeBounds=true,其实它的意思就是只解析,怎么说呢,我们看到紧接着的代码是BitmapFactory.decodeResource(getResources(),R.drawable.ss,options),参数里有options,那么其实就是获取R.drawable.ss的图片参数,而不进行真正的加载,所以这是轻量级的。接下来我们就通过options.outHeight和options.outWidth获取到图片的宽高,而变量height和width是我想压缩的最终的图片大小,我们通过for循环使图片的尺寸尽量接近我想要的尺寸,这里我们看到options.inSampleSize属性,其实就是通过这个设置我们想要压缩的倍数。官方给出的建议inSampleSize的值是2的整数倍,也就是说:1、2、4、8等;

OK,接下来就完事了,用完options,就将inJustDecodeBounds设为false。接着就解析我们压缩之后的图片吧~


笔者能力有限,不足之处欢迎指出。

你可能感兴趣的:(更高效的Bitmap压缩)