如何使用Luban压缩图片
1.在项目中的build.gradle添加依赖(需要用到RxJava1.0)
2.在代码中使用Luban压缩方法
1)Listerner方式。传入图片File,调用设置压缩监听setCompressListerner方法,处理压缩结果。
2)Rxjava方式,传入图片File,调用asObservable方法返回一个Observable观察者对象,使用RxJava方式来处理压缩结果。
项目地址
源码中最主要的方法就是thirdCompress(File file),即如何计算得出理想的压缩后宽高,以及图片大小。
Luban压缩算法思路
源码:
根据算法计算压缩后的宽高以及图片文件大小,在调用压缩方法compress,传入计算后的宽高以及图片大小
开始进行压缩,这里分别执行了压缩图片大小compress方法,以及压缩图片质量saveImage方法
压缩图片至预期大小,配置BitmapFactory.Options中inSampleSize的值来压缩图片的宽高
清楚了第三档压缩的实现之后,再了解使用Luban压缩时用到几个方法:
get()、load(file)、putGear() 、setFileName()、setCompressListener()、launch()、asObservable()。
get(Context context)
首先调用的是get(this),传入的是一个Context对象,调用私有的构造方法传入一个File对象创建一个Luban对象;File对象生成调用的是getPhotoCacheDir方法,来指定缓存目录。
路径为:app包名/cache/luban_disk_cache/文件名
load(File file)
public Luban load(File file) {
mFile = file;
return this;
}
这个方法比较容易理解,传入的是我们图片文件。
putGear(int gear)
public Luban putGear(int gear) {
this.gear = gear;
return this;
}
设置压缩等级,源码中只有两种等级:FIRST_GEAR 和 THIRD_GEAR,传入其他值无效。
private static final int FIRST_GEAR = 1;
public static final int THIRD_GEAR = 3;
setFileName(String fileName)
设置压缩后的图片名称
public Luban setFilename(String filename) {
this.filename = filename;
return this;
}
setCompressListener(OnCompressListener listener)
设置压缩监听 OnCompressListener是一个接口,里面有三个方法,对应三种状态
public Luban setCompressListener(OnCompressListener listener) {
compressListener = listener;
return this;
}
public interface OnCompressListener {
/**
* Fired when the compression is started, override to handle in your own code
* 压缩开始
*/
void onStart();
/**
* Fired when a compression returns successfully, override to handle in your own code
* 压缩成功
*/
void onSuccess(File file);
/**
* Fired when a compression fails to complete, override to handle in your own code
* 压缩失败
*/
void onError(Throwable e);
}
lanuch()
开始压缩,方法中使用的RxJava,根据设置的压缩等级来压缩图片
asObservable()
使用这个方法的话,采用的Rxjava方式返回一个观察者Observable。
public Observable asObservable() {
if (gear == FIRST_GEAR)//判断压缩等级
return Observable.just(mFile).map(new Func1() {
@Override
public File call(File file) {
return firstCompress(file); //调用第一档压缩方法
}
});
else if (gear == THIRD_GEAR)
return Observable.just(mFile).map(new Func1() {
@Override
public File call(File file) {
return thirdCompress(file);// 调用第三档压缩方法
}
});
else return Observable.empty();
}
1.不能很好的支持多图片压缩。(出现问题:多图压缩出现OOM)
2.项目使用中必须添加RxJava依赖。(已在测试项目中剔除掉RxJava依赖 「链接」