1. 程式人生 > >Android圖片無失真壓縮庫ImageCompress使用

Android圖片無失真壓縮庫ImageCompress使用

    圖片壓縮一直是Android的一個痛點,相比較於iOS的效果,Android的壓縮簡直可以用慘不忍睹來形容!

    開源庫ImageCompress是基於libjpeg-turbo來進行圖片的壓縮,它的優點在於相較於libjpeg來說壓縮時間大大的縮短了(4.5M的圖片壓縮完耗時約1.2秒),而相較於Android系統的圖片壓縮來說ImageCompress在圖片處理的過程使用了哈弗曼表,這大大的提高了相同體積下圖片的清晰度。

一:先來看看效果

    這個是手機拍攝的原圖4.28MB。


這裡是上一個圖片的詳細資訊


這個是普通壓縮後的圖片,大小為347KB



而可變圖片寬高的壓縮方式中,圖片最小可壓縮到40KB,解析度為747X1328



二、看過了效果,那麼我們來看下怎麼使用吧!

   1、 對於Android Studio的使用者,可以選擇新增:

    compile 'com.wgd.gdcp.gdcplibrary:ImageCompress:1.0.9'
implementation 'com.wgd.gdcp.gdcplibrary:ImageCompress:1.0.9'

    如果報錯的話可以在專案的build.gradle中加入

    allprojects {
    repositories {
        maven { url "https://dl.bintray.com/wangruijun/maven" }
    }

}

allprojects {
    repositories {
        jcenter() 
    }

}

2、使用圖片壓縮

    (1)、普通壓縮方式(前期方式,後期版本也會一直相容)

        強調:這裡runOnUiThread方法可以不用,但要注意的是:雖然jar包中處理了,但不保證一定是在主執行緒中回撥。

new GDCompress(MainActivity.this, tempCompressImgPath, tempCompressImgPath, new GDCompressImageListener() {
    @Override
public void OnSuccess(String path) {
        MainActivity.this
.runOnUiThread(new Runnable() { @Override public void run() { } }); } @Override public void OnError(int code, String errorMsg) { } });

    (2)、多個圖片同時壓縮(GDConfig中屬性下邊統一解釋)

            注:這裡OnError方法中返回的資料GDImageBean中通過code欄位來判斷圖片是否成功壓縮;而OnSuccess方法中所有的圖片都是壓縮完成的(即只要有一個圖片壓縮失敗都是回撥OnError方法)。

List<GDImageBean> imageBeans = new ArrayList<>();
for (int i = 0; i < selectList.size(); i++) {
    final String imgpath = selectList.get(i).getPath();
    imageBeans.add(new GDImageBean(new GDConfig().setmPath(imgpath)));
}
new GDCompressImageS(SendCircleActivity.this, new GDCompressImageSListener() {
    @Override
public void OnSuccess(List<GDImageBean> imageBeanList) {
        
    }

    @Override
public void OnError(List<GDImageBean> imageBeanList) {
        
    }
}, imageBeans);

        (3)、可控制圖片解析度大小的壓縮(GDConfig中屬性下邊統一解釋)

new GDCompressC(MainActivity.this, new GDConfig().setmPath(tempCompressImgPath).setChangeWH(true), new GDCompressImageListener() {
      @Override
public void OnSuccess(String path) {
          MainActivity.this.runOnUiThread(new Runnable() {
              @Override
public void run() {
                  
              }
          });
      }

      @Override
public void OnError(int code, String errorMsg) {

      }
  });

        (4)、GDConfig中屬性統一解釋

new GDConfig()
        .setmPath(tempCompressImgPath)//要壓縮圖片的原路徑
        .setSavePath(tempCompressImgPath)//壓縮圖片的儲存路徑,如果不設定將替換原檔案
        .setChangeWH(true)//是否要進行調整圖片解析度以壓縮到更小
        .setWidth(720)//需要調整解析度的時候有效,壓縮後的寬度(按比例計算後的,而不是直接使用這個)
        .setHeight(1280)//需要調整解析度的時候有效,壓縮後的高度(按比例計算後的,而不是直接使用這個)