項(xiàng)目中需要把人臉圖片批量生成二維碼后裁切成正方形存入本地文件夾基跑,前面的步驟都已經(jīng)完成了丈咐,但是在把bitmap轉(zhuǎn)成jpg的時(shí)候始終無(wú)法壓縮體積爵川,導(dǎo)致一張圖片可能好幾兆,最后找到辦法,方法如下:
File fileImage = new File(IMAGE_PATH + name + IMG_SUFFIX);
if (!fileImage.exists()) {
boolean result = fileImage.createNewFile();
}
FileOutputStream fosImage = new FileOutputStream(fileImage);
//圖片壓縮
Bitmap headCompressBitmap = compressScale(headBmp);
/*使用該方法生成圖片體積會(huì)很大,不推薦*/
//headCompressBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fosImage);
/*再次壓縮后寫(xiě)入流材部,生成本地圖片*/
fosImage.write(bitmapToBase64(headCompressBitmap));
fosImage.close();
壓縮方法:
/**
* 圖片按比例大小壓縮方法
* @param image (根據(jù)Bitmap圖片壓縮)
* @return
*/
public static Bitmap compressScale(Bitmap image) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
// 判斷如果圖片大于1M,進(jìn)行壓縮避免在生成圖片(BitmapFactory.decodeStream)時(shí)溢出
if (baos.toByteArray().length / 1024 > 1024) {
baos.reset();// 重置baos即清空baos
image.compress(Bitmap.CompressFormat.JPEG, 80, baos);
}
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
BitmapFactory.Options newOpts = new BitmapFactory.Options();
// 開(kāi)始讀入圖片,此時(shí)把options.inJustDecodeBounds 設(shè)回true了
newOpts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
//分辨率不能大于該數(shù)值
float hh = 512f;
float ww = 512f;
// 縮放比唯竹。由于是固定比例縮放乐导,只用高或者寬其中一個(gè)數(shù)據(jù)進(jìn)行計(jì)算即可
int be = 1;// be=1表示不縮放
if ((w == h || w > h) && w > ww) {// 如果寬度大的話根據(jù)寬度固定大小縮放
be = (int) (newOpts.outWidth / ww);
} else if ((w == h ||w < h) && h > hh) { // 如果高度高的話根據(jù)高度固定大小縮放
be = (int) (newOpts.outHeight / hh);
}
if (be <= 0)
be = 1;
newOpts.inSampleSize = be; // 設(shè)置縮放比例
// 重新讀入圖片,注意此時(shí)已經(jīng)把options.inJustDecodeBounds 設(shè)回false了
isBm = new ByteArrayInputStream(baos.toByteArray());
bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
return bitmap;
}
/*
* bitmap壓縮后轉(zhuǎn)byte
* */
public static byte[] bitmapCompressTobyteArray(Bitmap bitmap) {
byte[] bitmapBytes = new byte[0];
ByteArrayOutputStream baos = null;
try {
if (bitmap != null) {
baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
int options = 90;
while (baos.toByteArray().length / 1024 > 150) { // 循環(huán)判斷如果壓縮后圖片是否大于150kb,大于繼續(xù)壓縮
baos.reset(); // 重置baos即清空baos
bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);// 這里壓縮options%浸颓,把壓縮后的數(shù)據(jù)存放到baos中
options -= 10;// 每次都減少10
}
baos.flush();
baos.close();
bitmapBytes = baos.toByteArray();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (baos != null) {
baos.flush();
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return bitmapBytes;
}