Android部分手机拍照后获取的图片被旋转问题的解决方法
调用Android系统拍照功能后,三星手机拍摄后的照片被旋转了90度,横着拍给你变成竖的,竖的拍给你变成横的。其它品牌的手机都是正常的,就三星出现这个怪事。
在Android适配上,我原来一直以为国内的小米手机够奇葩了,结果还有更奇葩的!你说你没事旋转照片干啥,实在是猜不透其居心何在,纯粹是在给开发者制造麻烦啊!
解决办法是获取到拍照后照片被旋转的角度,再旋转回去就好了。
具体思路:
1、首先在调用拍照方法时,保存拍照后的相片原图,得到原图路径,(PhotoBitmapUtils是我自己写的一个工具类)
StringfileName="";
/**
*启动相机拍照
*/
privatevoidaddBitmapShoots(){
Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
//设置图片要保存的根路径+文件名
fileName=PhotoBitmapUtils.getPhotoFileName(getContext());
Filefile=newFile(fileName);
if(!file.exists()){
try{
file.createNewFile();
}catch(IOExceptione){
e.printStackTrace();
}
}
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(file));
startActivityForResult(intent,OPEN_CAMERA);
}
2、在获取相机返回的回调方法onActivityResult()中,修复被旋转的图片并取得修复后的图片路径,有了这个路径后就可以展示出来了
@Override
publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
super.onActivityResult(requestCode,resultCode,data);
//获取相机拍照返回
if(resultCode==Activity.RESULT_OK&&requestCode==OPEN_CAMERA){
//得到修复后的照片路径
Stringfilepath=PhotoBitmapUtils.amendRotatePhoto(fileName,getContext());
}
}
PhotoBitmapUtils类:
/**
*集合一些图片工具
*
*Createdbyzhuwentaoon2016-07-22.
*/
publicclassPhotoBitmapUtils{
/**
*存放拍摄图片的文件夹
*/
privatestaticfinalStringFILES_NAME="/MyPhoto";
/**
*获取的时间格式
*/
publicstaticfinalStringTIME_STYLE="yyyyMMddHHmmss";
/**
*图片种类
*/
publicstaticfinalStringIMAGE_TYPE=".png";
//防止实例化
privatePhotoBitmapUtils(){
}
/**
*获取手机可存储路径
*
*@paramcontext上下文
*@return手机可存储路径
*/
privatestaticStringgetPhoneRootPath(Contextcontext){
//是否有SD卡
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
||!Environment.isExternalStorageRemovable()){
//获取SD卡根目录
returncontext.getExternalCacheDir().getPath();
}else{
//获取apk包下的缓存路径
returncontext.getCacheDir().getPath();
}
}
/**
*使用当前系统时间作为上传图片的名称
*
*@return存储的根路径+图片名称
*/
publicstaticStringgetPhotoFileName(Contextcontext){
Filefile=newFile(getPhoneRootPath(context)+FILES_NAME);
//判断文件是否已经存在,不存在则创建
if(!file.exists()){
file.mkdirs();
}
//设置图片文件名称
SimpleDateFormatformat=newSimpleDateFormat(TIME_STYLE,Locale.getDefault());
Datedate=newDate(System.currentTimeMillis());
Stringtime=format.format(date);
StringphotoName="/"+time+IMAGE_TYPE;
returnfile+photoName;
}
/**
*保存Bitmap图片在SD卡中
*如果没有SD卡则存在手机中
*
*@parammbitmap需要保存的Bitmap图片
*@return保存成功时返回图片的路径,失败时返回null
*/
publicstaticStringsavePhotoToSD(Bitmapmbitmap,Contextcontext){
FileOutputStreamoutStream=null;
StringfileName=getPhotoFileName(context);
try{
outStream=newFileOutputStream(fileName);
//把数据写入文件,100表示不压缩
mbitmap.compress(Bitmap.CompressFormat.PNG,100,outStream);
returnfileName;
}catch(Exceptione){
e.printStackTrace();
returnnull;
}finally{
try{
if(outStream!=null){
//记得要关闭流!
outStream.close();
}
if(mbitmap!=null){
mbitmap.recycle();
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
/**
*把原图按1/10的比例压缩
*
*@parampath原图的路径
*@return压缩后的图片
*/
publicstaticBitmapgetCompressPhoto(Stringpath){
BitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inJustDecodeBounds=false;
options.inSampleSize=10;//图片的大小设置为原来的十分之一
Bitmapbmp=BitmapFactory.decodeFile(path,options);
options=null;
returnbmp;
}
/**
*处理旋转后的图片
*@paramoriginpath原图路径
*@paramcontext上下文
*@return返回修复完毕后的图片路径
*/
publicstaticStringamendRotatePhoto(Stringoriginpath,Contextcontext){
//取得图片旋转角度
intangle=readPictureDegree(originpath);
//把原图压缩后得到Bitmap对象
Bitmapbmp=getCompressPhoto(originpath);;
//修复图片被旋转的角度
Bitmapbitmap=rotaingImageView(angle,bmp);
//保存修复后的图片并返回保存后的图片路径
returnsavePhotoToSD(bitmap,context);
}
/**
*读取照片旋转角度
*
*@parampath照片路径
*@return角度
*/
publicstaticintreadPictureDegree(Stringpath){
intdegree=0;
try{
ExifInterfaceexifInterface=newExifInterface(path);
intorientation=exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL);
switch(orientation){
caseExifInterface.ORIENTATION_ROTATE_90:
degree=90;
break;
caseExifInterface.ORIENTATION_ROTATE_180:
degree=180;
break;
caseExifInterface.ORIENTATION_ROTATE_270:
degree=270;
break;
}
}catch(IOExceptione){
e.printStackTrace();
}
returndegree;
}
/**
*旋转图片
*@paramangle被旋转角度
*@parambitmap图片对象
*@return旋转后的图片
*/
publicstaticBitmaprotaingImageView(intangle,Bitmapbitmap){
BitmapreturnBm=null;
//根据旋转角度,生成旋转矩阵
Matrixmatrix=newMatrix();
matrix.postRotate(angle);
try{
//将原始图片按照旋转矩阵进行旋转,并得到新的图片
returnBm=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
}catch(OutOfMemoryErrore){
}
if(returnBm==null){
returnBm=bitmap;
}
if(bitmap!=returnBm){
bitmap.recycle();
}
returnreturnBm;
}
}
在调用修复图片角度方法的时候需要注意,现在的手机像素越来越大,拍完后一张照片有近10M,所以我们需要对图片进行压缩处理。不然在保存图片时会等待挺久的,屏幕会黑一会。
参考文档1
参考文档2
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。