2016-06-28 3 views
1

Это проблема, которая мучила меня за МЕСЯЦ. Я видел все в сообщениях о том, что они поворачивают изображение, выбранное из галереи, или взятое с намерением захвата изображения, но никто не работал. Большим нарушителем, конечно же, являются устройства Samsung, но я даже видел какое-то причудливое поведение на моем Nexus.Надежный способ получения правильно повернутого растрового изображения с камеры/галереи

Я использую намерения, чтобы выбрать изображения из галереи и камеры, но кажется, что пейзажные фотографии всегда, кажется, вращаются на 90 градусов. Первый шаг всегда ExifInterface, что-то вроде этого:

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); 

Где getRotationFromExifData (ориентация) является:

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; 
    } 
} 

Это не работает, ExifInterface (от того, что я вижу) всегда возвращает 0 (или нормально), особенно на устройствах Samsung.

Другие шаги включают запрос к MediaStore и другим нежелательным файлам, которые не работают. Может кто-нибудь, пожалуйста, скажите мне, какой именно способ получить правильное вращение изображения, используя все собственные намерения, поэтому все изображения отображаются правильно? Заранее спасибо.

ответ

0

Не уверен, что на фотографиях, выбранных из галереи, но для этого берется непосредственно из камеры, вы можете попробовать это:

В вашей деятельности/фрагмента, чтобы захватить фотографию, попробуйте добавить и включение в OrientationEventListener в onResume(), и отключить его в 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(); 
} 

Когда вы берете фотографию с помощью камеры, использовать этот поворот, чтобы повернуть растровое изображение, соответственно, следующим образом :

 camera.takePicture(null, null, null, new PictureCallback() { 

      @Override 
      public void onPictureTaken(byte[] data, Camera camera) { 

       Bitmap theBitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 

       if (rotation != -1) { 
        Matrix matrix = new Matrix(); 
        matrix.postRotate(rotation); 

        theBitmap = Bitmap.createBitmap(theBitmap, 0, 0, theBitmap.getWidth(), theBitmap.getHeight(), matrix, false); 
       } 

       // Save the bitmap here... 
      } 
     } 

Надеюсь, это поможет.

+0

Спасибо, но я не управляю камерой вручную, я использую сторонние приложения для захвата/выбора изображений. – Brandon

+0

Я действительно испытал это, когда попытался получить данные ориентации из Exif. К сожалению, я не нашел решения. –

Смежные вопросы