簡介:最近在做圖檔上傳的相關功能,需要對圖檔的大小和尺寸進行壓縮處理。
好處:(1)提升性能(2)節省流量
一、圖檔大小循環壓縮
/**
* 壓縮圖檔檔案到指定大小
*
* @param filePath
*/
public static void compressBmpToFile(String filePath) {
Bitmap bitmap = BitmapFactory.decodeFile(filePath);
if (null == bitmap) {
return;
}
final int BYTE_LEN = ;
//檔案最大為200KB
final int MAX_FILE_SIZE = ;
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
int quality = ;
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
while (baos.toByteArray().length / BYTE_LEN > MAX_FILE_SIZE) {
baos.reset();
quality -= ;
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
float size = calculteBitmapSize(bitmap);
}
try {
final FileOutputStream fos = new FileOutputStream(new File(filePath));
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 計算bitmap的大小
*
* @param bitmap
* @return bitmap的大小機關KB
*/
public static float calculteBitmapSize(Bitmap bitmap) {
if (null == bitmap) {
return f;
}
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, , baos);
final float size = (baos.toByteArray().length / );
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
return size;
}
二、圖檔尺寸壓縮
/**
* 壓縮圖檔的尺寸
*
* @param srcPath
* @return
*/
public static Bitmap compressImageFromFile(String srcPath) {
final BitmapFactory.Options newOpts = new BitmapFactory.Options();
//隻讀邊,不讀内容
newOpts.inJustDecodeBounds = true;
// 擷取這個圖檔的寬和高,注意此處的bitmap為null
BitmapFactory.decodeFile(srcPath, newOpts);
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
float hh = f;
float ww = f;
int be = ;
if (w > h && w > ww) {
be = (int) (newOpts.outWidth / ww);
} else if (w < h && h > hh) {
be = (int) (newOpts.outHeight / hh);
}
if (be <= ) {
be = ;
}
//設定采樣率
newOpts.inSampleSize = be;
//該模式是預設的,可不設
newOpts.inPreferredConfig = Bitmap.Config.RGB_565;
// 同時設定才會有效
newOpts.inPurgeable = true;
//當系統記憶體不夠時候圖檔自動被回收
newOpts.inInputShareable = true;
final Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
return bitmap;
}
三、Luban壓縮
Github:Luban圖檔壓縮
四、圖檔選擇器
PictureSelector圖檔選擇器