public class PicCompressUtil {
private static final String TAG = "PicCompressUtil";
public static boolean mStopCompress;
/**
* 判断传入的图片尺寸是否大于maxPicSize,如果大于就压缩至小于等于maxPicSize(这里用的是质量压缩)
*
* @param picArray 传入的图片路径数组
* @param maxPicSize 最大尺寸,单位kb
* @return 压缩后的图片路径数组
*/
public static String[] compressPic(String[] picArray, int maxPicSize) {
long startTime = System.currentTimeMillis();
try {
String[] newPicArray = new String[picArray.length];
for (int i = 0; i < picArray.length; i++) {
if(mStopCompress){
return null;
}
double picSize = new File(picArray[i]).length() / 1024;
LogUtil.d(TAG, "第" + (i + 1) + "张图片原图大小:" + picSize + "kb");
String picName = picArray[i].substring(picArray[i].lastIndexOf("/") + 1);
String newPicPath = LocalData.getPicUploadPath() + picName;
File newPicFile = new File(newPicPath);
if (picSize <= maxPicSize) {//小于maxPicSize,无需压缩直接拷贝到目标文件
FileInputStream fis = new FileInputStream(new File(picArray[i]));
FileOutputStream fos = new FileOutputStream(newPicFile);
byte[] bt = new byte[1024];
int len;
while ((len = fis.read(bt)) > 0 && !mStopCompress) {
fos.write(bt, 0, len);
}
fis.close();
fos.close();
newPicArray[i] = newPicPath;
continue;
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int quality = 90;
//Bitmap bitmap = BitmapUtil.getBitmap(picArray[i]);
Bitmap bitmap = BitmapFactory.decodeFile(picArray[i]);
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
LogUtil.d(TAG, "第" + (i + 1) + "张图片压缩后大小:" + baos.toByteArray().length / 1024 + "kb");
while (quality > 0 && baos.toByteArray().length / 1024 > maxPicSize && !mStopCompress) {
baos.reset();
quality -= 20;
if (quality > 0){
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
LogUtil.d(TAG, "第" + (i + 1) + "张图片压缩后大小:" + baos.toByteArray().length / 1024 + "kb");
}
}
if (!bitmap.isRecycled()){//bitmap用完后手动回收
bitmap.recycle();
}
//System.gc();
//将压缩后的图片拷贝到目标文件
FileOutputStream fileOutputStream = new FileOutputStream(newPicFile);
fileOutputStream.write(baos.toByteArray());
fileOutputStream.flush();
fileOutputStream.close();
newPicArray[i] = newPicPath;
}
long endTime = System.currentTimeMillis();
LogUtil.e(TAG, "压缩图片耗时:" + (endTime - startTime) / 1000 + "秒");
if(mStopCompress){
return null;
}
return newPicArray;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
压缩图片至指定大小
最新推荐文章于 2024-03-29 15:14:15 发布