解决android有的手机拍照后上传图片被旋转的问题
需求:做仿新浪发微博的项目,能够上传图片还有两外一个项目用到手机拍摄图片,这两个都需要把图片上传到服务器
遇到问题:有的手机拍摄的图片旋转90度,有的图片旋转了180度,有的手机是正常的,服务器要求的是正的,这样问题就来了,不能用户发个照片在微博上看到的是被旋转了的啊,另外一个项目里旋转了的图片直接匹配出现问题,这个更严重。
解决:开始的时候在网上没有找到很好的解决办法,谷歌百度的搜了一通,想到第一种解决方式,当手机拍照结束,在返回结果处理里面立即跳转到一个新的页面,在新的页面里让用户自己手动去旋转图片,然后点击确定。就可以上传到服务器正着的图片了;第二种解决方式,这是在论坛里发现的一个方法,可以获取图片的属性,读取图片的旋转角度。
第一种方式代码:
在onActivityResult里面处理跳转
- <spanstyle="font-size:18px;">Intentintent=newIntent(SendMicoBlog.this,RotaingActivity.class);
- MyAppmyApp=(MyApp)getApplication();
- myApp.setName(bitmap);//修改之后的名称
- myApp.setPhoto(isPhoto);
- startActivityForResult(intent,1);</span>
在RotaingActivity里面就可以作相应的旋转处理了
- <spanstyle="font-size:18px;">//获取bitmap
- MyAppmyApp=(MyApp)getApplication();
- bitmap=myApp.getName();
- System.out.println("RotaingActivityw="+bitmap.getWidth()+"H="+bitmap.getHeight());
- myBitmap=bitmap;
- myWidth=bitmap.getWidth();
- myHeight=bitmap.getHeight();
- //创建操作图片用的matrix对象
- matrix=newMatrix();
- Drawabledrawable=ImageDispose.bitmapToDrawable(bitmap);
- imageView.setBackgroundDrawable(drawable);
- btnCancel.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- RotaingActivity.this.finish();
- }
- });
- btnRightRotaing.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- myBitmap=rotaingImageView(-90);
- }
- });
- btnLeftRotaing.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- myBitmap=rotaingImageView(+90);
- }
- });
- btnOK.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- MyAppmyApp=(MyApp)getApplication();
- myApp.setName(myBitmap);//修改之后
- System.out.println("OKresultcoder");
- Intentintent=newIntent(RotaingActivity.this,SendMicoBlog.class);
- setResult(6,intent);
- RotaingActivity.this.finish();
- }
- });
- }
- privateBitmaprotaingImageView(intangle2){
- //旋转图片动作
- matrix.postRotate(angle2);
- System.out.println("angle2="+angle2);
- //创建新的图片
- BitmapresizedBitmap=Bitmap.createBitmap(bitmap,0,0,
- myWidth,myHeight,matrix,true);
- Drawabledrawable=ImageDispose.bitmapToDrawable(resizedBitmap);
- imageView.setBackgroundDrawable(drawable);
- returnresizedBitmap;
- }</span>
第二种方式:就简单多了,直接自己出偷着把照片给处理了,不需要用户的操作,这样体验会更好一点。
在onActivityResult里面处理
- BitmapFactory.OptionsbitmapOptions=newBitmapFactory.Options();
- bitmapOptions.inSampleSize=8;
- Filefile=newFile(SD_CARD_TEMP_DIR);
- /**
- *获取图片的旋转角度,有些系统把拍照的图片旋转了,有的没有旋转
- */
- intdegree=ImageDispose.readPictureDegree(file.getAbsolutePath());
- <spanstyle="font-size:18px;">BitmapcameraBitmap=BitmapFactory.decodeFile(SD_CARD_TEMP_DIR,bitmapOptions);
- bitmap=cameraBitmap;
- /**
- *把图片旋转为正的方向
- */
- bitmap=ImageDispose.rotaingImageView(degree,bitmap);
- upload(bitmap);</span>
- <spanstyle="font-size:18px;">/**
- *旋转图片
- *@paramangle
- *@parambitmap
- *@returnBitmap
- */
- publicstaticBitmaprotaingImageView(intangle,Bitmapbitmap){
- //旋转图片动作
- Matrixmatrix=newMatrix();;
- matrix.postRotate(angle);
- System.out.println("angle2="+angle);
- //创建新的图片
- BitmapresizedBitmap=Bitmap.createBitmap(bitmap,0,0,
- bitmap.getWidth(),bitmap.getHeight(),matrix,true);
- returnresizedBitmap;
- }</span>
- /**
- *读取图片属性:旋转的角度
- *@parampath图片绝对路径
- *@returndegree旋转的角度
- */
- 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;
- }
这样就搞定了,此时你上传的照片就是正的了。
第一种方式的图片