2012-11-22 94 views
4

照片旋轉90度,同時從三星移動照相機捕獲其他手機的其餘手機其工作正常。請幫助我。照片旋轉90度,同時在一些手機中捕獲

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(cameraIntent, IMAGE_CAPTURE); 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    super.onActivityResult(requestCode, resultCode, data);  
    try 
    { 
     if (requestCode == IMAGE_CAPTURE) { 
      if (resultCode == RESULT_OK){ 

       Uri contentUri = data.getData(); 
       if(contentUri!=null) 
       { 
        String[] proj = { MediaStore.Images.Media.DATA };   
        Cursor cursor = managedQuery(contentUri, proj, null, null, null);   
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);   
        cursor.moveToFirst();   
        imageUri = Uri.parse(cursor.getString(column_index)); 
       } 

       tempBitmap = (Bitmap) data.getExtras().get("data"); 
       mainImageView.setImageBitmap(tempBitmap); 
       isCaptureFromCamera = true; 
      } 
     } 

回答

11

這恰好是早期版本的Android中的一個錯誤。

我解決了這個問題,只是獲取方向角並相應地旋轉位圖。

public Bitmap decodeFile(String path) {//you can provide file path here 
    int orientation; 
    try { 
     if (path == null) { 
      return null; 
     } 
     // decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     // Find the correct scale value. It should be the power of 2. 
     final int REQUIRED_SIZE = 70; 
     int width_tmp = o.outWidth, height_tmp = o.outHeight; 
     int scale = 0; 
     while (true) { 
      if (width_tmp/2 < REQUIRED_SIZE 
        || height_tmp/2 < REQUIRED_SIZE) 
       break; 
      width_tmp /= 2; 
      height_tmp /= 2; 
     scale++; 
     } 
     // decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     Bitmap bm = BitmapFactory.decodeFile(path, o2); 
     Bitmap bitmap = bm; 

     ExifInterface exif = new ExifInterface(path); 

     orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 

     Log.e("ExifInteface .........", "rotation ="+orientation); 

     //exif.setAttribute(ExifInterface.ORIENTATION_ROTATE_90, 90); 

     Log.e("orientation", "" + orientation); 
     Matrix m = new Matrix(); 

     if ((orientation == ExifInterface.ORIENTATION_ROTATE_180)) { 
      m.postRotate(180); 
      //m.postScale((float) bm.getWidth(), (float) bm.getHeight()); 
      // if(m.preRotate(90)){ 
      Log.e("in orientation", "" + orientation); 
      bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),bm.getHeight(), m, true); 
      return bitmap; 
     } else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { 
      m.postRotate(90); 
      Log.e("in orientation", "" + orientation); 
      bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),bm.getHeight(), m, true); 
      return bitmap; 
     } 
     else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { 
      m.postRotate(270); 
      Log.e("in orientation", "" + orientation); 
      bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),bm.getHeight(), m, true); 
      return bitmap; 
     } 
     return bitmap; 
    } catch (Exception e) { 
     return null; 
    } 
} 
+0

如果有人會用你的解決方案,我只是想提一提,我認爲你以錯誤的方式來計算比例。正如你在你的代碼評論中所說的那樣,如果這個規模是2的冪,那麼它會更好。像你一樣增加一個規模不會向我們承諾它將是兩個冪。如果你想得到接近正確的所需寬度,你應該在每次迭代中將比例乘以2。 – MikeL

0

還查詢MediaStore.Images.Media.ORIENTATION值以獲取旋轉角度。然後你可以自己旋轉圖像或任何東西。

+0

它的工作良好的一些手機,但它不工作在一些供應商的手機我怎麼能認識到這一點,我應該在哪裏旋轉圖像 –

+0

如果供應商沒有正確實施他們的代碼,我猜你沒有什麼可以做... – Neil

0

我在做什麼: 首先檢查通過使用它的元數據信息的相機所拍攝圖像的方向,如果我們發現這個人像那麼就需要通過旋轉90°的圖像,並顯示否則只能顯示。

爲了獲得關於圖像方向的信息,我們可以使用ExifInterface。 就是這樣!

+0

你在這裏重複的同樣的答案,沒有更多的意義,即使是在我的答案更好的解釋 –