(對不起,標題是騙人的)
emmm...無論怎麼說,我也寫了一個圖片壓縮框架。
在Luban的算法策略上,我豐富了外圍的api,提供更多的可配參數,多線程壓縮和不一樣細粒度的任務控制。java
https://github.com/ghnor/Floraandroid
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();
自己內部採用線程池的方案去進行壓縮任務,同時進行了必要的內存檢查。git
在不會OOM的前提下,最大的提高了壓縮的速度,常見的9圖大小在20M+可以在2s內處理完成。github
固然,機器性能,系統當時的內存都是對此產生影響,個人測試機是【魅藍Note】...算法
因爲壓縮策略集成自Luban,因此最後圖片壓縮大小先後對比能夠參考Luban。api
我在此基礎上,對社交產品中常見的長圖的需求進行了必定的優化。安全