2014-03-01 84 views
1

我試圖製作一個應用程序,允許用戶從圖庫/拍照中選擇圖像並將結果設置爲位圖。當我測試應用程序時,我發現三星設備的旋轉是越野車。爲什麼三星android設備中的旋轉不起作用?

搜索了一段時間後,我發現,旋轉不是由谷歌定義,但製造商自己和三星似乎有一些不同的設置。此外,還有一些建議使用另一種方式來檢查旋轉。

如何解決這個問題? (注意:不僅拍攝照片,而且從畫廊的圖片具有相同的旋轉問題)

下面是提供的文件路徑getbitmap代碼:

private Bitmap getBitmap(String path) { 

     Uri uri = getImageUri(path); 
     InputStream in = null; 
     try { 
      in = mContentResolver.openInputStream(uri); 

      //Decode image size 
      BitmapFactory.Options o = new BitmapFactory.Options(); 
      o.inJustDecodeBounds = true; 

      BitmapFactory.decodeStream(in, null, o); 
      in.close(); 

      int scale = 1; 
      if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) { 
       scale = (int) Math.pow(2, (int) Math.round(Math.log(IMAGE_MAX_SIZE/(double) Math.max(o.outHeight, o.outWidth))/Math.log(0.5))); 
      } 

      BitmapFactory.Options o2 = new BitmapFactory.Options(); 
      o2.inSampleSize = scale; 
      in = mContentResolver.openInputStream(uri); 
      Bitmap b = BitmapFactory.decodeStream(in, null, o2); 
      in.close(); 

      return b; 
     } catch (FileNotFoundException e) { 
      Log.e(TAG, "file " + path + " not found"); 
     } catch (IOException e) { 
      Log.e(TAG, "file " + path + " not found"); 
     } 
     return null; 
    } 

感謝您的幫助

回答

5

我認爲你正在尋找的是從圖像中讀取exif旋轉並相應地旋轉它。我知道有與三星設備的問題,圖像不面對正確的方式,但你可以糾正的,像這樣:

首先,你必須從圖像讀取的Exif旋轉:

ExifInterface exif = new ExifInterface(pathToFile); 
int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); 

隨着這個信息可以糾正圖像的旋轉,這不幸稍微複雜一點,它涉及到用矩陣旋轉位圖。您可以創建這樣的矩陣:

Matrix matrix = new Matrix(); 
switch (rotation) { 
    case ExifInterface.ORIENTATION_FLIP_HORIZONTAL: 
     matrix.setScale(-1, 1); 
     break; 

    case ExifInterface.ORIENTATION_ROTATE_180: 
     matrix.setRotate(180); 
     break; 

    case ExifInterface.ORIENTATION_FLIP_VERTICAL: 
     matrix.setRotate(180); 
     matrix.postScale(-1, 1); 
     break; 

    case ExifInterface.ORIENTATION_TRANSPOSE: 
     matrix.setRotate(90); 
     matrix.postScale(-1, 1); 
     break; 

    case ExifInterface.ORIENTATION_ROTATE_90: 
     matrix.setRotate(90); 
     break; 

    case ExifInterface.ORIENTATION_TRANSVERSE: 
     matrix.setRotate(-90); 
     matrix.postScale(-1, 1); 
     break; 

    case ExifInterface.ORIENTATION_ROTATE_270: 
     matrix.setRotate(-90); 
     break; 

    case ExifInterface.ORIENTATION_NORMAL:   
    default: 
     break; 
} 

最後,你可以創建正確旋轉後的位:

int height = bitmap.getHeight(); 
int width = bitmap.getWidth(); 
Bitmap correctlyRotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); 

,避免OutOfMemory異常,你應該回收創建正確後,舊的不去正確地旋轉位圖像這樣旋轉一個:

bitmap.recycle(); 
相關問題