1. 程式人生 > >android手機拍照後上傳圖片被旋轉的問題

android手機拍照後上傳圖片被旋轉的問題

原貼子連結: http://blog.csdn.net/walker02/article/details/8211628/,謝謝點選開啟連結

遇到問題:有的手機拍攝的圖片旋轉90度,有的圖片旋轉了180度,有的手機是正常的,伺服器要求的是正的,這樣問題就來了,不能使用者發個照片在微博上看到的是被旋轉了的啊,另外一個專案裡旋轉了的圖片直接匹配出現問題,這個更嚴重。

解決:開始的時候在網上沒有找到很好的解決辦法,谷歌百度的搜了一通,想到第一種解決方式,當手機拍照結束,在返回結果處理裡面立即跳轉到一個新的頁面,在新的頁面裡讓使用者自己手動去旋轉圖片,然後點選確定。就可以上傳到伺服器正著的圖片了;第二種解決方式,這是在論壇裡發現的一個方法,可以獲取圖片的屬性,讀取圖片的旋轉角度。

第一種方式程式碼:

在onActivityResult裡面處理跳轉

  1. <span style="font-size:18px;">      Intent intent = new Intent(SendMicoBlog.this, RotaingActivity.class);  
  2.         MyApp myApp = (MyApp)getApplication();  
  3.         myApp.setName(bitmap);//修改之後的名稱
  4.         myApp.setPhoto(isPhoto);  
  5.         startActivityForResult(intent, 1
    );</span>  

在RotaingActivity裡面就可以作相應的旋轉處理了
  1. <span style="font-size:18px;">      //獲取bitmap
  2.         MyApp myApp = (MyApp)getApplication();  
  3.         bitmap = myApp.getName();  
  4.         System.out.println("RotaingActivity w = " + bitmap.getWidth() + "H = " + bitmap.getHeight());  
  5.         myBitmap = bitmap;  
  6.         myWidth = bitmap.getWidth();  
  7.         myHeight = bitmap.getHeight();  
  8.         // 建立操作圖片用的matrix物件
  9.         matrix = new Matrix();  
  10.         Drawable drawable = ImageDispose.bitmapToDrawable(bitmap);  
  11.         imageView.setBackgroundDrawable(drawable);  
  12.         btnCancel.setOnClickListener(new OnClickListener() {  
  13.             @Override
  14.             publicvoid onClick(View v) {  
  15.                 RotaingActivity.this.finish();  
  16.             }  
  17.         });  
  18.         btnRightRotaing.setOnClickListener(new OnClickListener() {  
  19.             @Override
  20.             publicvoid onClick(View v) {  
  21.                 myBitmap = rotaingImageView(-90);  
  22.             }  
  23.         });  
  24.         btnLeftRotaing.setOnClickListener(new OnClickListener() {  
  25.             @Override
  26.             publicvoid onClick(View v) {  
  27.                 myBitmap =  rotaingImageView(+90);  
  28.             }  
  29.         });  
  30.         btnOK.setOnClickListener(new OnClickListener() {  
  31.             @Override
  32.             publicvoid onClick(View v) {  
  33.                 MyApp myApp = (MyApp)getApplication();  
  34.                 myApp.setName(myBitmap);//修改之後
  35.                 System.out.println("OK resultcoder");  
  36.                 Intent intent = new Intent(RotaingActivity.this, SendMicoBlog.class);  
  37.                 setResult(6, intent);  
  38.                 RotaingActivity.this.finish();  
  39.             }  
  40.         });  
  41.     }  
  42.     private  Bitmap rotaingImageView(int angle2) {  
  43.         //旋轉圖片 動作
  44.         matrix.postRotate(angle2);  
  45.         System.out.println("angle2=" + angle2);  
  46.         // 建立新的圖片
  47.         Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 00,  
  48.                 myWidth, myHeight, matrix, true);  
  49.         Drawable drawable = ImageDispose.bitmapToDrawable(resizedBitmap);  
  50.         imageView.setBackgroundDrawable(drawable);        
  51.         return resizedBitmap;  
  52.     }</span>  

第二種方式:就簡單多了,直接自己出偷著把照片給處理了,不需要使用者的操作,這樣體驗會更好一點。

在onActivityResult裡面處理

  1. BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();  
  2. bitmapOptions.inSampleSize = 8;  
  3. File file = new File(SD_CARD_TEMP_DIR);  
  4. /** 
  5.  * 獲取圖片的旋轉角度,有些系統把拍照的圖片旋轉了,有的沒有旋轉 
  6.  */
  7. int degree = ImageDispose.readPictureDegree(file.getAbsolutePath());  
  1. <span style="font-size:18px;">Bitmap cameraBitmap = BitmapFactory.decodeFile(SD_CARD_TEMP_DIR, bitmapOptions);  
  2. bitmap = cameraBitmap;  
  3. /** 
  4.  * 把圖片旋轉為正的方向 
  5.  */
  6. bitmap = ImageDispose.rotaingImageView(degree, bitmap);  
  7. upload(bitmap);</span>  

  1. <span style="font-size:18px;">  /** 
  2.      * 旋轉圖片 
  3.      * @param angle 
  4.      * @param bitmap 
  5.      * @return Bitmap 
  6.      */
  7.     publicstatic Bitmap rotaingImageView(int angle , Bitmap bitmap) {  
  8.         //旋轉圖片 動作
  9.         Matrix matrix = new Matrix();;  
  10.         matrix.postRotate(angle);  
  11.         System.out.println("angle2=" + angle);  
  12.         // 建立新的圖片
  13.         Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 00,  
  14.                 bitmap.getWidth(), bitmap.getHeight(), matrix, true);  
  15.         return resizedBitmap;  
  16.     }</span>  
  1. /** 
  2.  * 讀取圖片屬性:旋轉的角度 
  3.  * @param path 圖片絕對路徑 
  4.  * @return degree旋轉的角度 
  5.  */
  6.    publicstaticint readPictureDegree(String path) {  
  7.        int degree  = 0;  
  8.        try {  
  9.                ExifInterface exifInterface = new ExifInterface(path);  
  10.                int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);  
  11.                switch (orientation) {  
  12.                case ExifInterface.ORIENTATION_ROTATE_90:  
  13.                        degree = 90;  
  14.                        break;  
  15.                case ExifInterface.ORIENTATION_ROTATE_180:  
  16.                        degree = 180;  
  17.                        break;  
  18.                case ExifInterface.ORIENTATION_ROTATE_270:  
  19.                        degree = 270;  
  20.                        break;  
  21.                }  
  22.        } catch (IOException e) {  
  23.                e.printStackTrace();  
  24.        }  
  25.        return degree;  
  26.    }