2016-06-28 5 views
1

これはMONTHSに悩まされている問題です。私はすべてを見たことがありますギャラリーから選択されたイメージを回転したり、イメージキャプチャの意図を介して撮影されたものについては、しかし誰も働いていません。大きな犯罪者は、もちろんSamsungデバイスですが、私はNexusでファンキーな行動を見たこともあります。カメラ/ギャラリーから適切に回転したビットマップを取得する信頼できる方法

私はギャラリーとカメラから画像を選択するためにインテントを使用していますが、風景写真は常にが90度回転しているようです。 (私が見ているものとは)ExifInterfaceは常に0を返し、

private static int getRotationFromExifData(int orientation) { 
    Log.d(LOG_TAG, "Orientation: " + orientation); 
    switch (orientation) { 
     case ExifInterface.ORIENTATION_ROTATE_90: 
      Log.d(LOG_TAG, "Exif returned 90"); 
      return 90; 
     case ExifInterface.ORIENTATION_ROTATE_180: 
      Log.d(LOG_TAG, "Exif returned 180"); 
      return 180; 
     case ExifInterface.ORIENTATION_ROTATE_270: 
      Log.d(LOG_TAG, "Exif returned 270"); 
      return 270; 
     default: // Normal or 0 
      Log.d(LOG_TAG, "Exif returned 0"); 
      return 0; 
    } 
} 

これは動作しません:getRotationFromExifData(オリエンテーション)がある

ExifInterface exif = new ExifInterface(imageUri.getLastPathSegment(); 
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 
int rotationNeeded = getRotationFromExifData(orientation); 
Matrix matrix = new Matrix(); 
matrix.setRotate(rotationNeeded); 

:最初のステップは、このような何か、常にExifInterfaceです(または正常)、特にサムスンのデバイスでは

その他の手順では、MediaStoreや動作しないその他の迷惑メールのクエリが含まれます。誰かが、すべてのネイティブインテントを使用して適切な画像回転を得る正確な方法を教えてください。そうすれば、すべての画像が正しく表示されますか?前もって感謝します。ギャラリーからそれが直接カメラから撮影のために選択した写真わからない

答えて

0

、あなたはこれを試すことができます:あなたの活動/フラグメントで

を、写真をキャプチャ追加とonResumeでOrientationEventListenerを有効にしようとします()、 onPause()で無効にします。ここで

はあなたのカメラを使って写真を撮るときは、次のように、それに応じてビットマップを回転させることの回転を使用しonResume()ここで

@Override 
public void onResume() { 
    super.onResume(); 
    orientationListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL) { 
      @Override 
      public void onOrientationChanged(int angle) { 
       if (angle > 315 || angle <= 45) { 
        rotation = 90; 
       } else if (angle > 45 && angle <= 135) { 
        rotation = 180; 
       } else if (angle > 135 && angle <= 225) { 
        rotation = 270; 
       } else if (angle > 225 && angle <= 315) { 
        rotation = 0; 
       } else { 
        rotation = -1;// UNKNOWN 
       } 

       if (currentFacing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
        rotation = (360 - rotation) % 360; 
       } 

       Log.i("Orientation", "rotation = " + rotation); 
      } 
     }; 

     if (orientationListener.canDetectOrientation()) { 
      orientationListener.enable(); 
     } 
} 

はonPause(ある)

@Override 
public void onPause() { 
    //... 
    orientationListener.disable(); 
    super.onPause(); 
} 

です:

これが役に立ちます。

+0

ありがとうございますが、手動でカメラを管理しているわけではありません。私は、サードパーティのアプリケーションを使用して画像をキャプチャ/選択しています。 – Brandon

+0

Exifからオリエンテーションデータを取得しようとしたとき、私は実際にこれを体験しました。残念ながら私は解決策を見つけませんでした。 –

関連する問題