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

來源:互聯網
上載者:User

標籤:android   style   blog   http   io   os   ar   java   for   

轉至 http://blog.csdn.net/walker02/article/details/8211628

需求:做仿新浪發微博的項目,能夠上傳圖片還有兩外一個項目用到手機拍攝圖片,這兩個都需要把圖片上傳到伺服器

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

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

第一種方式代碼:

在onActivityResult裡面處理跳轉

 

[java] view plaincopy 
  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裡面就可以作相應的旋轉處理了

 

 

 

 

[java] view plaincopy 
  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.           
  9.         // 建立操作圖片用的matrix對象  
  10.         matrix = new Matrix();  
  11.         Drawable drawable = ImageDispose.bitmapToDrawable(bitmap);  
  12.         imageView.setBackgroundDrawable(drawable);  
  13.           
  14.           
  15.         btnCancel.setOnClickListener(new OnClickListener() {  
  16.               
  17.             @Override  
  18.             public void onClick(View v) {  
  19.                   
  20.                 RotaingActivity.this.finish();  
  21.             }  
  22.         });  
  23.           
  24.         btnRightRotaing.setOnClickListener(new OnClickListener() {  
  25.               
  26.             @Override  
  27.             public void onClick(View v) {  
  28.                 myBitmap = rotaingImageView(-90);  
  29.             }  
  30.         });  
  31.           
  32.         btnLeftRotaing.setOnClickListener(new OnClickListener() {  
  33.               
  34.             @Override  
  35.             public void onClick(View v) {  
  36.                 myBitmap =  rotaingImageView(+90);  
  37.             }  
  38.         });  
  39.           
  40.         btnOK.setOnClickListener(new OnClickListener() {  
  41.               
  42.             @Override  
  43.             public void onClick(View v) {  
  44.                 MyApp myApp = (MyApp)getApplication();  
  45.                 myApp.setName(myBitmap);//修改之後  
  46.                 System.out.println("OK resultcoder");  
  47.                 Intent intent = new Intent(RotaingActivity.this, SendMicoBlog.class);  
  48.                 setResult(6, intent);  
  49.                 RotaingActivity.this.finish();  
  50.             }  
  51.         });  
  52.     }  
  53.     private  Bitmap rotaingImageView(int angle2) {  
  54.         //旋轉圖片 動作  
  55.         matrix.postRotate(angle2);  
  56.         System.out.println("angle2=" + angle2);  
  57.         // 建立新的圖片  
  58.         Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,  
  59.                 myWidth, myHeight, matrix, true);  
  60.         Drawable drawable = ImageDispose.bitmapToDrawable(resizedBitmap);  
  61.         imageView.setBackgroundDrawable(drawable);        
  62.         return resizedBitmap;  
  63.     }</span>  


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

 

 

 

在onActivityResult裡面處理

[java] view plaincopy 
  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());  



 

 

[java] view plaincopy 
  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>  

 

[java] view plaincopy 
  1. <span style="font-size:18px;">  /** 
  2.      * 旋轉圖片 
  3.      * @param angle 
  4.      * @param bitmap 
  5.      * @return Bitmap 
  6.      */  
  7.     public static 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, 0, 0,  
  14.                 bitmap.getWidth(), bitmap.getHeight(), matrix, true);  
  15.         return resizedBitmap;  
  16.     }</span>  

 


 

[java] view plaincopy 
    1. /** 
    2.  * 讀取圖片屬性:旋轉的角度 
    3.  * @param path 圖片絕對路徑 
    4.  * @return degree旋轉的角度 
    5.  */  
    6.    public static int 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.    }  

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.