转自:http://blog.csdn.net/luhuajcdd/article/details/8948261
?
android bitmap compress
android的照相功能随着手机硬件的发展,变得越来越强大,能够找出很高分辨率的图片。
有些场景中,需要照相并且上传到服务,但是由于图片的大小太大,那么就上传就会很慢(在有些网络情况下),而且很耗流量,要想速度快,那么就需要减小图片的大小。减少图片的大小有两种方法,1. 照小图片; 2. 压缩大图片。 照相时获取小图片一般不太符合要求,因为,图片的清晰度会很差,但是这种情况有个好处就是应用速度会快些; 压缩图片,就是把大图片压缩小,降低图片的质量,在一定范围内,降低图片的大小,并且满足需求(图片仍就清晰)。下面组要是介绍图片的压缩:
?
1. 照相请查看http://blog.csdn.net/luhuajcdd/article/details/8826587?->想要保存图片到制定目录,启动Camera应用时,需要指定文件
2. 压缩过程:
? ? 2.1 从图片路径中读取图片(图片很大,不能全部加在到内存中处理,要是全部加载到内存中会内存溢出)
- final?BitmapFactory.Options?options?=?new?BitmapFactory.Options();??
- ????options.inJustDecodeBounds?=?true;??
- ????BitmapFactory.decodeFile(filePath,?options);??
- ??
- ????//?Calculate?inSampleSize??
- ????options.inSampleSize?=?calculateInSampleSize(options,?480,?800);??
- ??
- ????//?Decode?bitmap?with?inSampleSize?set??
- ????options.inJustDecodeBounds?=?false;??
- ??????
- ????Bitmap?bm?=?BitmapFactory.decodeFile(filePath,?options);??
- int?degree?=?readPictureDegree(filePath);??
- ????????bm?=?rotateBitmap(bm,degree)?;??
- 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();??
- ??
- ????????//?Setting?post?rotate?to?90??
- ????????Matrix?mtx?=?new?Matrix();??
- ????????mtx.postRotate(rotate);??
- ????????return?Bitmap.createBitmap(bitmap,?0,?0,?w,?h,?mtx,?true);??
- ????}??
- bm.compress(Bitmap.CompressFormat.JPEG,?30,?baos);//30?是压缩率,表示压缩70%;?如果不压缩是100,表示压缩率为0??
?
完整的方法代码:
- public?static?Bitmap?getSmallBitmap(String?filePath)?{??
- ??????????????
- ????????final?BitmapFactory.Options?options?=?new?BitmapFactory.Options();??
- ????????options.inJustDecodeBounds?=?true;??
- ????????BitmapFactory.decodeFile(filePath,?options);??
- ??
- ????????//?Calculate?inSampleSize??
- ????????options.inSampleSize?=?calculateInSampleSize(options,?480,?800);??
- ??
- ????????//?Decode?bitmap?with?inSampleSize?set??
- ????????options.inJustDecodeBounds?=?false;??
- ??????????
- ????????Bitmap?bm?=?BitmapFactory.decodeFile(filePath,?options);??
- ????????if(bm?==?null){??
- ????????????return??null;??
- ????????}??
- ????????int?degree?=?readPictureDegree(filePath);??
- ????????bm?=?rotateBitmap(bm,degree)?;??
- ????????ByteArrayOutputStream?baos?=?null?;??
- ????????try{??
- ????????????baos?=?new?ByteArrayOutputStream();??
- ????????????bm.compress(Bitmap.CompressFormat.JPEG,?30,?baos);??
- ??????????????
- ????????}finally{??
- ????????????try?{??
- ????????????????if(baos?!=?null)??
- ????????????????????baos.close()?;??
- ????????????}?catch?(IOException?e)?{??
- ????????????????e.printStackTrace();??
- ????????????}??
- ????????}??
- ????????return?bm?;??
- ??
- ????}??
- private?static?int?calculateInSampleSize(BitmapFactory.Options?options,??
- ????????????int?reqWidth,?int?reqHeight)?{??
- ????????//?Raw?height?and?width?of?image??
- ????????final?int?height?=?options.outHeight;??
- ????????final?int?width?=?options.outWidth;??
- ????????int?inSampleSize?=?1;??
- ??
- ????????if?(height?>?reqHeight?||?width?>?reqWidth)?{??
- ??
- ????????????//?Calculate?ratios?of?height?and?width?to?requested?height?and??
- ????????????//?width??
- ????????????final?int?heightRatio?=?Math.round((float)?height??
- ????????????????????/?(float)?reqHeight);??
- ????????????final?int?widthRatio?=?Math.round((float)?width?/?(float)?reqWidth);??
- ??
- ????????????//?Choose?the?smallest?ratio?as?inSampleSize?value,?this?will??
- ????????????//?guarantee??
- ????????????//?a?final?image?with?both?dimensions?larger?than?or?equal?to?the??
- ????????????//?requested?height?and?width.??
- ????????????inSampleSize?=?heightRatio?<?widthRatio???widthRatio?:?heightRatio;??
- ????????}??
- ??
- ????????return?inSampleSize;??
- ????}??