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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。