天天看點

Android圖檔壓縮架構精确壓縮、指定大小、指定尺寸壓縮(原理:采樣率壓縮 + Matrix縮放 + 品質壓縮)EasyImageCompressor

EasyImageCompressor

github:https://github.com/ZS-ZhangsShun/EasyImageCompressor

簡介

1、通過采樣率壓縮 + 縮放 + 品質壓縮,使用簡單的配置即可完成圖檔指定大小指定尺寸的壓縮
2、内部采用線程池設計,預設在子線程執行壓縮任務,在主線程回調onStart onError onSuccess方法
3、自動檢測圖檔旋轉角度,壓縮後不影響圖檔原來的旋轉角度
4、架構内部調試日志支援通過 enableLog 開關進行配置,預設是關閉的。           

使用方法

第一步:在project的build.gradle 檔案中添加JitPack依賴

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
           

第二步: 在Module的build.gradle檔案中添加對本庫的依賴

dependencies {
    ...
    implementation 'com.github.ZS-ZhangsShun:EasyImageCompressor:1.0.7'
}
           

第三步:開始使用(6.0及以上版本需要在代碼中動态申請Manifest.permission.WRITE_EXTERNAL_STORAGE 參考示例代碼) 以下方法可直接拷貝到項目中使用 參數根據實際情況修改即可 詳情參考demo中 MainActivity的示例代碼

(1)單張圖檔壓縮

//場景一 把單張圖檔壓縮到100k以内 同時像素不超過1200(寬、高都不大于1200)
    EasyImgCompress.withSinglePic(this, "/mnt/sdcard/test1.jpg")
            .maxPx(1200)
            .maxSize(100)
            .enableLog(true)
            .setOnCompressSinglePicListener(new OnCompressSinglePicListener() {
                @Override
                public void onStart() {
                    Log.i("EasyImgCompress", "onStart");
                }

                @Override
                public void onSuccess(File file) {
                    Log.i("EasyImgCompress", "onSuccess size = " + GBMBKBUtil.getSize(file.length()) + " getAbsolutePath= " + file.getAbsolutePath());
                }

                @Override
                public void onError(String error) {
                    Log.e("EasyImgCompress", "onError error = " + error);
                }
            }).start();

        過濾EasyImgCompress 看日志:
        2020-05-24 12:09:29.781 17286-17286/com.zs.easy.imgcompress I/EasyImgCompress: onStart
        2020-05-24 12:09:29.782 17286-17286/com.zs.easy.imgcompress I/EasyImgCompress: 原圖檔位址:/mnt/sdcard/test1.jpg
        2020-05-24 12:09:29.782 17286-17286/com.zs.easy.imgcompress I/EasyImgCompress: 儲存位址:/data/user/0/com.zs.easy.imgcompress/cache/CompressCache
        2020-05-24 12:09:30.931 17286-17286/com.zs.easy.imgcompress I/EasyImgCompress: onSuccess size = 99.31KB    getAbsolutePath= /data/user/0/com.zs.easy.imgcompress/cache/CompressCache/1590293370924.jpg
           

(2)多張圖檔壓縮

//場景二 把多張圖檔每一張都壓縮到100k以内 同時每張像素不超過1200(寬、高都不大于1200)
    List<String> imgs = new ArrayList<>();
    imgs.add(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test1.jpg");
    imgs.add(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test2.jpg");
    imgs.add(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test3.jpg");
    imgs.add(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test4.jpg");
    EasyImgCompress.withMultiPics(this, imgs)
            .maxPx(1200)
            .maxSize(100)
            .enableLog(true)
            .setOnCompressMultiplePicsListener(new OnCompressMultiplePicsListener() {
                @Override
                public void onStart() {
                    Log.i("EasyImgCompress", "onStart");
                }

                @Override
                public void onSuccess(List<File> successFiles) {
                    for (int i = 0; i < successFiles.size(); i++) {
                        Log.i("EasyImgCompress", "onSuccess: successFile size = " + GBMBKBUtil.getSize(successFiles.get(i).length()) + "path = " + successFiles.get(i).getAbsolutePath());
                    }
                }

                @Override
                public void onHasError(List<File> successFiles, List<ErrorBean> errorImages) {
                    for (int i = 0; i < successFiles.size(); i++) {
                        Log.i("EasyImgCompress", "onHasError: successFile  size = " + GBMBKBUtil.getSize(successFiles.get(i).length()) + "path = " + successFiles.get(i).getAbsolutePath());
                    }
                    for (int i = 0; i < errorImages.size(); i++) {
                        Log.e("EasyImgCompress", "onHasError: errorImg url = " + errorImages.get(i).getErrorImgUrl());
                        Log.e("EasyImgCompress", "onHasError: errorImg msg = " + errorImages.get(i).getErrorMsg());
                    }
                }
            }).start();

      過濾EasyImgCompress 看日志:
      2020-05-24 12:09:30.949 17286-17286/com.zs.easy.imgcompress I/EasyImgCompress: onStart
      2020-05-24 12:09:34.984 17286-17286/com.zs.easy.imgcompress I/EasyImgCompress: onSuccess: successFile size = 99.31KB   path = /data/user/0/com.zs.easy.imgcompress/cache/CompressCache/1590293372046.jpg
      2020-05-24 12:09:34.988 17286-17286/com.zs.easy.imgcompress I/EasyImgCompress: onSuccess: successFile size = 93.11KB   path = /data/user/0/com.zs.easy.imgcompress/cache/CompressCache/1590293372918.jpg
      2020-05-24 12:09:34.993 17286-17286/com.zs.easy.imgcompress I/EasyImgCompress: onSuccess: successFile size = 95.21KB   path = /data/user/0/com.zs.easy.imgcompress/cache/CompressCache/1590293374030.jpg
      2020-05-24 12:09:34.997 17286-17286/com.zs.easy.imgcompress I/EasyImgCompress: onSuccess: successFile size = 94.50KB   path = /data/user/0/com.zs.easy.imgcompress/cache/CompressCache/1590293374976.jpg
           

(3)相關配置

//1、壓縮後的儲存路徑設定
    //預設是應用内部緩存 context.getCacheDir().getPath() + File.separator + "CompressCache"
    // 即:/data/data/<application package>/cache/CompressCache
    EasyImgCompress.withXXX().cacheDir("傳入壓縮完後存儲的檔案夾路徑,注意是檔案夾路徑")
           

混淆配置

-keep class com.zs.easy.imgcompress.** {*;}

繼續閱讀