解决android有的手机拍照后上传图片被旋转的问题

需求:做仿新浪发微博的项目,能够上传图片还有两外一个项目用到手机拍摄图片,这两个都需要把图片上传到服务器

遇到问题:有的手机拍摄的图片旋转90度,有的图片旋转了180度,有的手机是正常的,服务器要求的是正的,这样问题就来了,不能用户发个照片在微博上看到的是被旋转了的啊,另外一个项目里旋转了的图片直接匹配出现问题,这个更严重。

解决:开始的时候在网上没有找到很好的解决办法,谷歌百度的搜了一通,想到第一种解决方式,当手机拍照结束,在返回结果处理里面立即跳转到一个新的页面,在新的页面里让用户自己手动去旋转图片,然后点击确定。就可以上传到服务器正着的图片了;第二种解决方式,这是在论坛里发现的一个方法,可以获取图片的属性,读取图片的旋转角度。

第一种方式代码:

在onActivityResult里面处理跳转

  1. <spanstyle="font-size:18px;">Intentintent=newIntent(SendMicoBlog.this,RotaingActivity.class);
  2. MyAppmyApp=(MyApp)getApplication();
  3. myApp.setName(bitmap);//修改之后的名称
  4. myApp.setPhoto(isPhoto);
  5. startActivityForResult(intent,1);</span>

在RotaingActivity里面就可以作相应的旋转处理了

  1. <spanstyle="font-size:18px;">//获取bitmap
  2. MyAppmyApp=(MyApp)getApplication();
  3. bitmap=myApp.getName();
  4. System.out.println("RotaingActivityw="+bitmap.getWidth()+"H="+bitmap.getHeight());
  5. myBitmap=bitmap;
  6. myWidth=bitmap.getWidth();
  7. myHeight=bitmap.getHeight();
  8. //创建操作图片用的matrix对象
  9. matrix=newMatrix();
  10. Drawabledrawable=ImageDispose.bitmapToDrawable(bitmap);
  11. imageView.setBackgroundDrawable(drawable);
  12. btnCancel.setOnClickListener(newOnClickListener(){
  13. @Override
  14. publicvoidonClick(Viewv){
  15. RotaingActivity.this.finish();
  16. }
  17. });
  18. btnRightRotaing.setOnClickListener(newOnClickListener(){
  19. @Override
  20. publicvoidonClick(Viewv){
  21. myBitmap=rotaingImageView(-90);
  22. }
  23. });
  24. btnLeftRotaing.setOnClickListener(newOnClickListener(){
  25. @Override
  26. publicvoidonClick(Viewv){
  27. myBitmap=rotaingImageView(+90);
  28. }
  29. });
  30. btnOK.setOnClickListener(newOnClickListener(){
  31. @Override
  32. publicvoidonClick(Viewv){
  33. MyAppmyApp=(MyApp)getApplication();
  34. myApp.setName(myBitmap);//修改之后
  35. System.out.println("OKresultcoder");
  36. Intentintent=newIntent(RotaingActivity.this,SendMicoBlog.class);
  37. setResult(6,intent);
  38. RotaingActivity.this.finish();
  39. }
  40. });
  41. }
  42. privateBitmaprotaingImageView(intangle2){
  43. //旋转图片动作
  44. matrix.postRotate(angle2);
  45. System.out.println("angle2="+angle2);
  46. //创建新的图片
  47. BitmapresizedBitmap=Bitmap.createBitmap(bitmap,0,0,
  48. myWidth,myHeight,matrix,true);
  49. Drawabledrawable=ImageDispose.bitmapToDrawable(resizedBitmap);
  50. imageView.setBackgroundDrawable(drawable);
  51. returnresizedBitmap;
  52. }</span>

第二种方式:就简单多了,直接自己出偷着把照片给处理了,不需要用户的操作,这样体验会更好一点。

在onActivityResult里面处理

  1. BitmapFactory.OptionsbitmapOptions=newBitmapFactory.Options();
  2. bitmapOptions.inSampleSize=8;
  3. Filefile=newFile(SD_CARD_TEMP_DIR);
  4. /**
  5. *获取图片的旋转角度,有些系统把拍照的图片旋转了,有的没有旋转
  6. */
  7. intdegree=ImageDispose.readPictureDegree(file.getAbsolutePath());



  1. <spanstyle="font-size:18px;">BitmapcameraBitmap=BitmapFactory.decodeFile(SD_CARD_TEMP_DIR,bitmapOptions);
  2. bitmap=cameraBitmap;
  3. /**
  4. *把图片旋转为正的方向
  5. */
  6. bitmap=ImageDispose.rotaingImageView(degree,bitmap);
  7. upload(bitmap);</span>

  1. <spanstyle="font-size:18px;">/**
  2. *旋转图片
  3. *@paramangle
  4. *@parambitmap
  5. *@returnBitmap
  6. */
  7. publicstaticBitmaprotaingImageView(intangle,Bitmapbitmap){
  8. //旋转图片动作
  9. Matrixmatrix=newMatrix();;
  10. matrix.postRotate(angle);
  11. System.out.println("angle2="+angle);
  12. //创建新的图片
  13. BitmapresizedBitmap=Bitmap.createBitmap(bitmap,0,0,
  14. bitmap.getWidth(),bitmap.getHeight(),matrix,true);
  15. returnresizedBitmap;
  16. }</span>


  1. /**
  2. *读取图片属性:旋转的角度
  3. *@parampath图片绝对路径
  4. *@returndegree旋转的角度
  5. */
  6. publicstaticintreadPictureDegree(Stringpath){
  7. intdegree=0;
  8. try{
  9. ExifInterfaceexifInterface=newExifInterface(path);
  10. intorientation=exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL);
  11. switch(orientation){
  12. caseExifInterface.ORIENTATION_ROTATE_90:
  13. degree=90;
  14. break;
  15. caseExifInterface.ORIENTATION_ROTATE_180:
  16. degree=180;
  17. break;
  18. caseExifInterface.ORIENTATION_ROTATE_270:
  19. degree=270;
  20. break;
  21. }
  22. }catch(IOExceptione){
  23. e.printStackTrace();
  24. }
  25. returndegree;
  26. }


这样就搞定了,此时你上传的照片就是正的了。

第一种方式的图片

解决android有的手机拍照后上传图片被旋转的问题