Android大圖壓縮心得

加飯也加菜發表於2017-10-12

原創不易,轉發請註明出處。

在拍照上傳或相簿選擇圖片上傳時,需要將選擇的圖片進行壓縮,如果不壓縮,就可能出現記憶體溢位的
情況,導致程式崩潰。

在我的一個上線的專案中,經過實踐,我總結出一套方便可用的壓縮方法,在這套方法中,用到了一個開源
的工具:com.blankj:utilcode:1.7.1。

具體實踐步驟如下:

1:按比例壓縮

首先,根據圖片的地址獲取到file檔案,然後將file檔案物件傳入ImageUtils.getBitmap()方法中獲取

到bitmap,通過bitmap的getHeight()和getWidth()可以獲取到圖片的原始寬高。根據實踐得知,將圖

片的寬度設定為800的時候,圖片可以壓縮的程度和壓縮後的清晰度為最好,因此將壓縮後圖片的寬度

設定為800,然後根據原始寬高獲取到壓縮後圖片的高度。此時就可以呼叫

ImageUtils.compressByScale()方法,傳入引數,就可以獲取到壓縮後的圖片的bitmap物件。

ImageUtils.compressByScale()方法其實就是呼叫了Bitmap的createScaledBitmap()方法,將原始的

bitmap物件進行了按比例壓縮。

2:將按比例壓縮後的bitmap物件進行質量壓縮

首先根據最後圖片要儲存到的路徑和要儲存的檔名建立一個檔案物件,然後用BufferedOutputStream
將進行質量壓縮後的圖片儲存到這個檔案中。呼叫第一步中按比例壓縮後的bitmap物件的compress()方
法進行壓縮,format的格式為Bitmap.CompressFormat.JPEG,質量壓縮為80%。

-------------------------------------------------總結好的工具類---------------------------------

import android.graphics.Bitmap;
import android.os.SystemClock;
import android.util.Log;

import com.blankj.utilcode.util.ImageUtils;
import com.blankj.utilcode.util.LogUtils;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;

/**

  • Created by Administrator on 2017/8/4.
    */

public class FileUtils {
public static File getPic(String path) {
File file = null;
try {
Bitmap bitmap = ImageUtils.getBitmap(new File(path));
//獲取原始寬高
int height = bitmap.getHeight();
LogUtils.e("原圖height:" + height);
int width = bitmap.getWidth();
LogUtils.e("原圖width:" + width);
//獲取新寬高
int newWidth = 1024;
int newHeight = 1024 * height / width;
LogUtils.e("新圖newHeight:" + newHeight);
Bitmap bitmap1 = ImageUtils.compressByScale(bitmap, newWidth, newHeight);
file = saveFile(bitmap1);
} catch (Exception e) {
e.printStackTrace();
}
return file;
}

public static File saveFile(Bitmap bm) {
    String path = OConstants.CACHES_DIR;
    File dirFile = new File(path);
    String fileName = SystemClock.currentThreadTimeMillis() + ".png";
    LogUtils.e(fileName);
    if (!dirFile.exists()) {
        dirFile.mkdir();
    }
    File myCaptureFile = new File(path + fileName);
    BufferedOutputStream bos = null;
    try {
        bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
        bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
        bos.flush();
        bos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    LogUtils.e("test111", "myCaptureFile:" + myCaptureFile.length());
    return myCaptureFile;
}複製程式碼

}

相關文章