圖片壓縮問題解決辦法
阿新 • • 發佈:2019-01-09
- Listener方式,呼叫監聽即可
Luban.get(this) .load(File) //傳人要壓縮的圖片 .putGear(Luban.THIRD_GEAR) //設定壓縮檔次,預設三擋 .setCompressListener(new OnCompressListener() { //設定回撥 @Override public void onStart() { //TODO 壓縮開始前呼叫,可以在方法內啟動 loading UI } @Override public void onSuccess(File file) { //TODO 壓縮成功後呼叫,返回壓縮後的圖片檔案 } @Override public void onError(Throwable e) { //TODO 當壓縮過去出現問題時呼叫 } }).launch(); //啟動壓縮
- RxJava方式,自行隨意控制執行緒
Luban.get(this) .load(file) .putGear(Luban.THIRD_GEAR) .asObservable() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnError(new Action1<Throwable>() { @Override public void call(Throwable throwable) { throwable.printStackTrace(); } }) .onErrorResumeNext(new Func1<Throwable, Observable<? extends File>>() { @Override public Observable<? extends File> call(Throwable throwable) { return Observable.empty(); } }) .subscribe(new Action1<File>() { @Override public void call(File file) { //TODO 壓縮成功後呼叫,返回壓縮後的圖片檔案 } });
- 與glide相配合使用:在onSuccess的方法裡用:
Glide.with(Context context).load(File file).into(ImageView imageview);
二、用程式碼方式
//壓縮圖片尺寸 public Bitmap compressBySize(String pathName, int targetWidth, int targetHeight) { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true;// 不去真的解析圖片,只是獲取圖片的頭部資訊,包含寬高等; Bitmap bitmap = BitmapFactory.decodeFile(pathName, opts); // 得到圖片的寬度、高度; float imgWidth = opts.outWidth; float imgHeight = opts.outHeight; // 分別計算圖片寬度、高度與目標寬度、高度的比例;取大於等於該比例的最小整數; int widthRatio = (int) Math.ceil(imgWidth / (float) targetWidth); int heightRatio = (int) Math.ceil(imgHeight / (float) targetHeight); opts.inSampleSize = 1; if (widthRatio > 1 || widthRatio > 1) { if (widthRatio > heightRatio) { opts.inSampleSize = widthRatio; } else { opts.inSampleSize = heightRatio; } } //設定好縮放比例後,載入圖片進內容; opts.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeFile(pathName, opts); return bitmap; }