看到这个标题是不是有点懵?为什么叫更高效的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。接着就解析我们压缩之后的图片吧~
笔者能力有限,不足之处欢迎指出。