市场上手机像素普遍比较高,拍的相片较大,上传原始图片到服务器耗时耗流量,所以要对图片进行压缩后再进行上传具体流程如下
1、通过文件路径获取图片转化为bitmap对象
/**
* 通过路径转为bitMap对象
* @param imgPath
* @return
*/
public static Bitmap getBitmap(String imgPath) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;//只解析图片边沿,获取宽高
BitmapFactory.decodeFile(imgPath, options);
// 计算缩放比 转为320*480大小图片
options.inSampleSize = calculateInSampleSize(options, 320, 480);
// 完整解析图片返回bitmap
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(imgPath, options);
}
计算图片大小的方法
/**
* 计算图片大小
* @param options
* @param reqWidth
* @param reqHeight
* @return
*/
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
2、开启线程对图片进行压缩
/**
* 压缩文件
* @param bmp
* @param file
*/
public static void compressBmpToFile(final Bitmap bmp, final File file){
//开启子线程进行压缩
new Thread(new Runnable() {
@Override
public void run() {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int options = 60;
bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);
//压缩至100k以内
while (baos.toByteArray().length / 1024 > 100) {
baos.reset();
options -= 10;
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();
}
}
}).start();
}
3、设置压缩图片存储路径
/**
* 获取sd卡路径
*/
public static String getSdcardPath() {
String path = Environment.getExternalStorageDirectory() + File.separator + "edaibu" + File.separator;
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
return path;
}
Activity代码中调用返回file类型
/**
* 压缩图片
* @param imagePath
*/
private File compressImg(String imagePath) {
LogUtils.e("压缩前长度:"+new File(imagePath).length());
Bitmap bitmap= CompressImageUtil.getBitmap(imagePath);
final String path=CompressImageUtil.getSdcardPath()+index+"compress.jpg";
File files=new File(path);
CompressImageUtil.compressBmpToFile(bitmap,files);
LogUtils.e("压缩后的图片长度:"+files.length());
return files;
}
最后记得在图片上传成功后将压缩的图片进行删除
String compressedPicDir =Environment.getExternalStorageDirectory() + File.separator + "edaibu";
//删除压缩后的图片
destroyPhoto(compressedPicDir);
/**
* 销毁文件夹图片
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
private void destroyPhoto(String path) {
LogUtils.e("销毁拍照图片");
//里面输入特定目录
File file = new File(path);
File temp;
if (file.isDirectory() && file.listFiles().length > 0) {
File[] fileList = file.listFiles();
for (int i = 0; i < fileList.length; i++) {
temp = fileList[i];
temp.delete();
}
}
}