/** * 上传服务器时把图片调用下面方法压缩后 保存到临时文件夹 图片压缩后小于100KB,失真度不明显 * * @param path * @return * @throws IOException */ public static Bitmap revitionImageSize(String path) throws IOException {
BufferedInputStream in = new BufferedInputStream(new FileInputStream(
new File(path)));
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(in, null, options);
in.close();
int i = 0;
Bitmap bitmap = null;
// options.inJustDecodeBounds=true那么将不返回实际的bitmap对象,不给其分配内存空间但是可以得到一些解码边界信息即图片大小等信息
// outHeight(图片原始高度)和 outWidth(图片的原始宽度)
// inSampleSize表示缩略图大小为原始图片大小的几分之一
// options.outWidth >> i(右移运算符)表示:outWidth/(2^i)
while (true) {
if ((options.outWidth >> i <= 1000)
&& (options.outHeight >> i <= 1000)) { //此处压缩到宽和高都小于1000
in = new BufferedInputStream(
new FileInputStream(new File(path)));
options.inSampleSize = (int) Math.pow(2.0D, i); // 幂运算 i为几次方
options.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeStream(in, null, options);
break;
}
i += 1;
}
return bitmap;
}
上述方法是对图片的宽和高进行压缩
下面方法是对图片大小进行压缩
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
这样 就完成了 图片的压缩 失真度 根据需要 调整压缩比例(0-100)
其中网上的图片压缩代码中 还有处理角度的代码,暂且还不知道何时需要处理角度,想存起来吧,或许以后会用到:
private static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
- private static Bitmap rotateBitmap(Bitmap bitmap, int rotate){
- if(bitmap == null)
- return null ;
-
- int w = bitmap.getWidth();
- int h = bitmap.getHeight();
-
-
- Matrix mtx = new Matrix();
- mtx.postRotate(rotate);
- return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
- }
这两个方法 在 缩放宽高之后调用
- int degree = readPictureDegree(filePath);
- bm = rotateBitmap(bm,degree) ;