压缩图片大小,尺寸不变
- 将已知路径的图片压缩至不大于目标大小,并保存至指定路径
/**
* 质量压缩,通过给定的路径来压缩图片并保存到指定路径
*
* @param srcPath
* 资源图片的路径
* @param savePath
* 图片的保存路径
* @param aimSize
* 压缩到图片大小的最大值
*/
public static void compressImageByPath(String srcPath, String savePath,
int aimSize) {
// 注意savePath的文件夹和文件的判断
Bitmap imgBitmap = BitmapFactory.decodeFile(srcPath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int percent = 100;// 定义压缩比例,初始为不压缩
imgBitmap.compress(Bitmap.CompressFormat.JPEG, percent, baos);
int currentSize = baos.toByteArray().length / 1024;
while (currentSize > aimSize) {// 循环判断压缩后图片是否大于目的大小,若大于则继续压缩
baos.reset();// 重置baos,即清空baos
//注意:此处该方法的第一个参数必须为JPEG,若为PNG则无法压缩。
imgBitmap.compress(Bitmap.CompressFormat.JPEG, percent, baos);
currentSize = baos.toByteArray().length / 1024;
percent -= 5;
if (percent <= 0) {
break;
}
}
try {//将数据写入输出流
FileOutputStream fos = new FileOutputStream(savePath);
baos.writeTo(fos);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {//清空缓存,关闭流
baos.flush();
baos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (!imgBitmap.isRecycled()) {
imgBitmap.recycle();//回收图片所占的内存
System.gc();//提醒系统及时回收
}
}
绳锯木断,水滴石穿。海纳百川,积少成多。一分耕耘,一份收获。