1. 程式人生 > >圖片壓縮問題解決辦法

圖片壓縮問題解決辦法

  1. 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();    //啟動壓縮

  1. 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 壓縮成功後呼叫,返回壓縮後的圖片檔案
            }
        });

  1. 與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;
    }