android基於libjpeg-turbo的圖片壓縮框架

Light

license
JCenter

a lightweight image compress framework for Android based on libJpeg.
一個基於libJpeg的壓縮圖片框架, 支持配合rxjava使用。
能夠一行代碼解決圖片下載->壓縮->顯示的過程。java

demo效果

先展現一下壓縮先後的效果對比,以及文件大小和佔用內存的大小 demo比較簡單,運行的時候請打開sd卡權限和相冊拍照權限。react

基本功能:

支持的壓縮類型: File,String,Uri,Bytes,Bitmap,DrawableResourceID,Drawableandroid

  • 1:圖片的旋轉、縮放、平移操做
  • 2:異步和同步壓縮處理
  • 3:同步壓縮
  • 4:能夠配合RxJava2使用

版本記錄:

1.0.0 完成大體功能
   1.1.0 修復從uri獲取路徑錯誤的bug;
         增長ignoreSize的設置,以便用於壓縮圖片保持原尺寸;
         支持配合rxjava2使用;
複製代碼

使用方法:

android {
        ...
        defaultConfig{
          
            ...
            ndk {
                abiFilters 'armeabi-v7a', 'armeabi', 'x86'
            }  
        }
        
    }
    
    //引入
    implementation 'com.noober.light:core:1.1.0'
    
    //若是要配合rxjava2,加入rxjava2的依賴
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
    implementation 'io.reactivex.rxjava2:rxjava:2.1.7'
複製代碼

設置壓縮參數:

CompressArgs這個類用於設置每次所要壓縮到的指定的寬高以及壓縮質量。使用以下:git

CompressArgs args = new CompressArgs.Builder().width(width).height(height).quality(70).ignoreSize(false).build();
複製代碼
參數說明:

1.width: 要壓縮到的圖片的寬度,單位px 2.height: 要壓縮到的圖片的高度,單位px 3.quality: 壓縮質量, 可選範圍是0-100。 4.ignoreSize: 是否要忽略壓縮後圖片寬高的限制, 若是設爲true,壓縮的時候會根據原圖自己大小進行壓縮,設置的width和height就會失效,默認false。 由於從網絡下載圖片保存到本地,中間默認會自動壓縮圖片,若是不想對圖片進行壓縮,並保持寬高的話,設置以下參數便可:github

CompressArgs args = new CompressArgs.Builder().quality(100).ignoreSize(true).build();
複製代碼
默認參數:

調用compress方法的時候也能夠不初始化這個參數,框架會自動初始化一個默認的壓縮設置。網絡

默認規則以下: 壓縮圖片的最大默認高度是屏幕高度; 圖片的最大寬度是屏幕寬度; 默認壓縮質量是85; ignoreSize 爲false。框架

設置全局的壓縮參數,以便不須要每次都去設置:

建議在Application的onCreate中進行初始化,使用以下:異步

LightConfig lightConfig = new LightConfig();
lightConfig.setDefaultQuality(xx);
lightConfig.setMaxWidth(xx);
lightConfig.setMaxHeight(xx);
lightConfig.setMaxHeight(xx);
lightConfig.setNeedIgnoreSize(xx);
Light.getInstance().setConfig(lightConfig);
複製代碼

壓縮圖片,獲取Bitmap:images -> Bitmap

支持File,String,Uri,Bytes,Bitmap,DrawableResourceID,Drawable這5種類型壓縮爲Bitmap。maven

//String,Uri,Bytes,Bitmap,File -->bitmap
Bitmap bitmap = Light.getInstance().compress(path);
//args爲CompressArgs壓縮參數,不傳入,即用默認參數
Bitmap bitmap = Light.getInstance().compress(path, args);
.....
複製代碼

壓縮圖片而且保存到本地:images -> boolean

支持File,String,Uri,Bytes,Bitmap這5種類型保存爲文件。 想對於壓縮成Bitmap的方法只是多了一個輸出路徑。svg

//images --> boolean //保存圖片,返回值表明保存是否成功
//img爲要壓縮的圖片,args是壓縮參數,不傳即默認, outPath爲輸出路徑
Light.getInstance().compress(img, args, outPath);
Light.getInstance().compress(img, outPath);
//支持類型Bitmap, Bytes, String, Resource, Uri, Drawable
複製代碼

配合RxJava2使用

關於配合RxJava2使用的類都在RxLight這個類中。 經過與rxJava的配合,一行代碼就能實現從網絡下載->壓縮->顯示,這個過程,很是的方便。

使用方法以下:

從網絡獲取資源

RxLight會自動對圖片進行下載 -> 壓縮 -> 顯示或保存到本地

從網絡獲取資源 -> Bitmap:
//uri類型的網絡資源
Flowable.just(uri).compose(RxLight.compressForUriHttp()).subscribe(bitmap -> ivCompress.setImageBitmap(bitmap));
List<Uri> urlList = new ArrayList<>();
....
Flowable.fromIterable(urlList).compose(RxLight.compressForUriHttp()).subscribe(bitmap -> ivCompress.setImageBitmap(bitmap));
//url類型的網絡資源
Flowable.just(url).compose(RxLight.compressForStringHttp()).subscribe(bitmap -> ivCompress.setImageBitmap(bitmap));
List<String> urlList = new ArrayList<>();
....
Flowable.fromIterable(urlList).compose(RxLight.compressForStringHttp()).subscribe(bitmap -> ivCompress.setImageBitmap(bitmap));
//或者傳入自定義的壓縮參數只須要在compressForUriHttp() 和 compressForStringHttp()傳入CompressArgs便可
CompressArgs args = new CompressArgs();
....
Flowable.just(uri).compose(RxLight.compressForUriHttp(args)).subscribe(bitmap -> ivCompress.setImageBitmap(bitmap));
複製代碼
從網絡獲取資源 -> boolean(保存到本地):

與上述方法相似,只須要compressForUri() 和 compressForString()傳入要保存到的路徑便可。一樣支持uri和string的網絡地址類型。

String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/pic.jpg";
Flowable.just(uri).compose(RxLight.compressForUriHttp(path)).subscribe(bitmap -> ivCompress.setImageBitmap(bitmap));
//自定義壓縮參數
CompressArgs args = new CompressArgs();
....
Flowable.just(uri).compose(RxLight.compressForUriHttp(path, args)).subscribe(bitmap -> ivCompress.setImageBitmap(bitmap));
複製代碼
經過本地資源異步壓縮

一樣都支持 File,String,Uri,Bytes,Bitmap,DrawableResourceID,Drawable這幾種類型

圖片資源 -> Bitmap

經過RxLight.compress()方法便可:

Flowable.just(image).compose(RxLight.compress()).subscribe(bitmap -> ivCompress.setImageBitmap(bitmap));
複製代碼
圖片資源 -> Boolean(保存到本地):

經過RxLight.compress(outPath)方法便可:

Flowable.just(image).compose(RxLight.compress(outPath)).subscribe(bitmap -> ivCompress.setImageBitmap(bitmap));
複製代碼

其餘

  • 1:MemoryComputeUtil工具類,獲取bitmap佔用內存的大小,返回值單位是kb。

    MemoryComputeUtil.getMemorySize(compressBitmap)
    複製代碼
  • 2:關於so文件的編譯,能夠移步github.com/JavaNoober/…。 如何去編譯,我在好久以前的寫過一個博客介紹過:blog.csdn.net/qq_25412055…

  • 3:MatrixUtil工具類 能夠很方便的對Bitmap進行放大縮小、旋轉、縮放、平移等處理,使用也很方便,支持Matrix的大部分方法。

    Bitmap result = new MatrixUtil.Build().scale(scaleSize, scaleSize).rotate(90f).bitmap(bitmap).build();
    複製代碼

總結

版本還在逐步更新中,歡迎各位大佬star,以及提出建議。

GitHub demo下載地址:github.com/JavaNoober/…

相關文章
相關標籤/搜索