其實作過圖片壓縮的朋友應該知道,這一塊的技術點就那麼幾個,按照邏輯處理起來也是不同的效果,主要是關注處理出來的圖片的尺寸和質量。java
這裏首先按照原始圖片的寬高比,等比計算出sampleSize。代碼網上也有相關,這裏貼出方法的代碼:git
BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(srcImagePath, options); //根據原始圖片的寬高比和指望的輸出圖片的寬高比計算最終輸出的圖片的寬和高 float srcWidth = options.outWidth; float srcHeight = options.outHeight; float maxWidth = outWidth;//指望輸出的圖片寬度 float maxHeight = outHeight;//指望輸出的圖片高度 float srcRatio = srcWidth / srcHeight; float outRatio = maxWidth / maxHeight; float actualOutWidth = srcWidth;//最終輸出的圖片寬度 float actualOutHeight = srcHeight;//最終輸出的圖片高度 if (srcWidth > maxWidth || srcHeight > maxHeight) { if (srcRatio < outRatio) { actualOutHeight = maxHeight; actualOutWidth = actualOutHeight * srcRatio; } else if (srcRatio > outRatio) { actualOutWidth = maxWidth; actualOutHeight = actualOutWidth / srcRatio; } else { actualOutWidth = maxWidth; actualOutHeight = maxHeight; } } //計算sampleSize options.inSampleSize = computSampleSize(options, actualOutWidth, actualOutHeight);
ANDORID API:
github
public boolean compress(CompressFormat format, int quality, OutputStream stream)
方法以下:web
//進行有損壓縮 ByteArrayOutputStream baos = new ByteArrayOutputStream(); int options_ = 100; actualOutBitmap.compress(Bitmap.CompressFormat.JPEG, options_, baos);//質量壓縮方法,把壓縮後的數據存放到baos中 (100表示不壓縮,0表示壓縮到最小) int baosLength = baos.toByteArray().length; while (baosLength / 1024 > maxFileSize) {//循環判斷若是壓縮後圖片是否大於maxMemmorrySize,大於繼續壓縮 baos.reset();//重置baos即讓下一次的寫入覆蓋以前的內容 options_ = Math.max(0, options_ - 10);//圖片質量每次減小10 actualOutBitmap.compress(Bitmap.CompressFormat.JPEG, options_, baos);//將壓縮後的圖片保存到baos中 baosLength = baos.toByteArray().length; if (options_ == 0)//若是圖片的質量已降到最低則,再也不進行壓縮 break; }
爲了達到最佳的壓縮結果,能夠將上面兩種方案同時進行。若是壓縮消耗的時間很長,須要將壓縮過程放入後臺線程中執行。
多線程
這裏實現的功能有:併發
另外,如何結合使用service和多線程會在下篇文章具體說明。性能
開源github地址以下:
DuKBitmapImagesspa
歡迎你們訪問並star,若是有任何問題能夠在評論中加以提問,謝謝~~線程