(對不起,標題是騙人的)
emmm...不管怎麽說,我也寫了一個圖片壓縮框架。
在Luban的算法策略上,我豐富了外圍的api,提供更多的可配參數,多線程壓縮和不同細粒度的任務控制。
項目地址
https://github.com/ghnor/Flora
依賴
dependencies { ... compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.ghnor:flora:1.0.0-alpha1' }
用法用例
- 異步壓縮:
Flora.with().load(source...).compress(new Callback<>());
- 同步壓縮:
Flora.with().load(R.drawable.test2).compressSync();
可控的壓縮任務
Flora.with(Activity) Flora.with(FragmentActivity) Flora.with(Fragment) Flora.with(SupportFragment) // 上面的四類,會自動在頁面生命周期結束後,終止壓縮任務。 // 通過TAG標誌位來結束一系列的任務。 Flora.with(TAG) // 強制結束任務。 Flora.cancel(TAG); // 無參,此時的任務進行其實是不受控的,強烈建議不要采用這種寫法。 Flora.with()
更多屬性
Flora.with() // 配置inSample和quality的算法,內置了一套基於Luban的壓縮算法 .calculation(new Calculation() { @Override public int calculateInSampleSize(int srcWidth, int srcHeight) { return super.calculateInSampleSize(srcWidth, srcHeight); } @Override public int calculateQuality(int srcWidth, int srcHeight, int targetWidth, int targetHeight) { return super.calculateQuality(srcWidth, srcHeight, targetWidth, targetHeight); } }) // 對壓縮後的圖片做個性化地處理,如:添加水印 .addDecoration(new Decoration() { @Override public Bitmap onDraw(Bitmap bitmap) { return super.onDraw(bitmap); } }) // 配置Bitmap的色彩格式 .bitmapConfig(Bitmap.Config.RGB_565) // 最大文件尺寸,不建議配置此項,目前采用的方式是重復寫入文件,判斷大小,比較耗時 .maxFileSize(1.0) // 同時可進行的最大壓縮任務數量 .compressTaskNum(1) // 安全內存,設置為2,表示此次壓縮任務需要的內存小於1/2可用內存才進行壓縮任務 .safeMemory(2) // 壓縮完成的圖片在磁盤的存儲目錄 .diskDirectory(File) .load(source...) .compress();
其他
- 壓縮速度
本身內部采用線程池的方案去進行壓縮任務,同時進行了必要的內存檢查。
在不會OOM的前提下,最大的提升了壓縮的速度,常見的9圖大小在20M+能夠在2s內處理完成。
當然,機器性能,系統當時的內存都是對此產生影響,我的測試機是【魅藍Note】...
- 壓縮效果
由於壓縮策略集成自Luban,所以最後圖片壓縮大小前後對比可以參考Luban。
我在此基礎上,對社交產品中常見的長圖的需求進行了一定的優化。
Tags: Flora 壓縮 with 任務 算法 calculateInSampleSize
文章來源: