通常開發中會對一張圖片進行壓縮,通常有三種方式:質量壓縮,尺寸壓縮,採樣率壓縮。
一.質量壓縮通常通過設置bitmap的options屬性來降低圖片的質量,但圖片的像素不會減少,所佔內存也不會減少
public static void compressImageToFile(Bitmap bmp,File file) {//bmp需要壓縮的bitmap圖片對象 file壓縮後圖片保存的位置
// 0-100 100爲不壓縮
int options = 20;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 把壓縮後的數據存放到baos中
bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
二.尺寸壓縮,通過縮放圖片像素減少佔用內存大小
public static void compressBitmapToFile(Bitmap bmp, File file){
// 尺寸壓縮倍數,值越大,圖片尺寸越小
int ratio = 8;
// 壓縮Bitmap到對應尺寸
Bitmap result = Bitmap.createBitmap(bmp.getWidth() / ratio, bmp.getHeight() / ratio, Config.ARGB_8888);
Canvas canvas = new Canvas(result);
Rect rect = new Rect(0, 0, bmp.getWidth() / ratio, bmp.getHeight() / ratio);
canvas.drawBitmap(bmp, null, rect, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 把壓縮後的數據存放到baos中
result.compress(Bitmap.CompressFormat.JPEG, 100 ,baos);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
三.採樣率壓縮
/**
* 設置圖片的採樣率,降低圖片像素
* @param filePath
* @param file
*/
public static void compressBitmap(String filePath, File file){
// 數值越高,圖片像素越低
int inSampleSize = 8;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
// options.inJustDecodeBounds = true;//爲true的時候不會真正加載圖片,而是得到圖片的寬高信息。
//採樣率
options.inSampleSize = inSampleSize;
Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 把壓縮後的數據存放到baos中
bitmap.compress(Bitmap.CompressFormat.JPEG, 100 ,baos);
try {
if(file.exists())
{
file.delete();
}
else {
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
附加:工具類 計算縮放比:
/**
* 計算縮放比
*
* @param bitWidth 當前圖片寬度
* @param bitHeight 當前圖片高度
* @return
* @Description:函數描述
*/
public static int getRatioSize(int bitWidth, int bitHeight) {
// 圖片最大分辨率
int imageHeight = 1920;
int imageWidth = 1080;
// 縮放比
int ratio = 1;
// 縮放比,由於是固定比例縮放,只用高或者寬其中一個數據進行計算即可
if (bitWidth > bitHeight && bitWidth > imageWidth) {
// 如果圖片寬度比高度大,以寬度爲基準
ratio = bitWidth / imageHeight;
} else if (bitWidth < bitHeight && bitHeight > imageHeight) {
// 如果圖片高度比寬度大,以高度爲基準
ratio = bitHeight / imageHeight;
}
// 最小比率爲1
if (ratio <= 0)
ratio = 1;
return ratio;
}