Ориентация изображения от цели галереи/камеры

Я получаю изображение к своему приложению из намерения камеры/галереи. Во многих телефонах изображение, которое я прочитал из намерения /Uri, уже повернуто для правильной ориентации. Например, N1, Legend, Desire, это так.

Но затем на некоторых телефонах (например, Milestone1, GalaxyS) картина всегда в пейзаже больше, независимо от того, каким образом была сделана фотография. Это означает, что в моем приложении портретный образ представляется неверно для пользователя. Я попытался прочитать EXIF-информацию на картинке, но тег ориентации всегда равен 0. Должен быть способ узнать правильную ориентацию изображения, потому что в Milestone1 приложение галереи правильно отображает портретные изображения.

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

Спасибо за помощь!

Ответ 1

Флорианский ответ работает на изображения галереи.

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

Код:

public static int getCameraPhotoOrientation(Context context, Uri imageUri, String imagePath){
     int rotate = 0;
     try {
         context.getContentResolver().notifyChange(imageUri, null);
         File imageFile = new File(imagePath);
         ExifInterface exif = new ExifInterface(
                 imageFile.getAbsolutePath());
         int orientation = exif.getAttributeInt(
                 ExifInterface.TAG_ORIENTATION,
                 ExifInterface.ORIENTATION_NORMAL);

         switch (orientation) {
         case ExifInterface.ORIENTATION_ROTATE_270:
             rotate = 270;
             break;
         case ExifInterface.ORIENTATION_ROTATE_180:
             rotate = 180;
             break;
         case ExifInterface.ORIENTATION_ROTATE_90:
             rotate = 90;
             break;
         }


         Log.v(TAG, "Exif orientation: " + orientation);
     } catch (Exception e) {
         e.printStackTrace();
     }
    return rotate;
 }

EDIT: Как можно прочитать в комментариях, некоторые устройства не поддерживают информацию Exif, havn't проверили, но я думаю, что HTC этого не делает. не забудьте проверить, какие устройства и создать альтернативу.

Ответ 2

Следующий метод возвращает ориентацию изображения в градусах. Он работает с изображениями из галереи. Возвращаемые значения для:

  • нормальный пейзаж: 0
  • нормальный портрет: 90
  • перевернутый пейзаж: 180
  • перевернутый портрет: 270
  • изображение не найдено: -1

Код:

public static int getOrientation(Context context, Uri photoUri) {
    Cursor cursor = context.getContentResolver().query(photoUri,
            new String[] { MediaStore.Images.ImageColumns.ORIENTATION },
            null, null, null);

    try {
        if (cursor.moveToFirst()) {
            return cursor.getInt(0);
        } else {
            return -1;
        }
    } finally {
        cursor.close();
    }
}

Ответ 3

        int rotate = 0;
        try {
            File imageFile = new File(sourcepath);
            ExifInterface exif = new ExifInterface(
                    imageFile.getAbsolutePath());
            int orientation = exif.getAttributeInt(
                    ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_NORMAL);

            switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_270:
                rotate = 270;
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                rotate = 180;
                break;
            case ExifInterface.ORIENTATION_ROTATE_90:
                rotate = 90;
                break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        Matrix matrix = new Matrix();
        matrix.postRotate(rotate);
        bitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

Ответ 4

Это лучший ответ, который я нашел, по раралалу. fooobar.com/questions/53665/...
Отлично подходит для галереи или камеры.

Ответ 5

Сначала вы должны создать объект галереи, используя contentresolver, а затем передать uri, созданный для намерения захвата изображения. Затем вы можете посмотреть данные exif, а не данные ориентации галереи.

Ответ 6

Matrix matrix = new Matrix();

ExifInterface exifReader = new ExifInterface(filePath);

int orientation = exifReader.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);

if (orientation ==ExifInterface.ORIENTATION_NORMAL) {

      // Do nothing. The original image is fine.

} else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {

       matrix.postRotate(90);

} else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {

       matrix.postRotate(180);

} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {

      matrix.postRotate(270);

}

Ответ 7

У меня такая же проблема с S1, и я заметил, что даже если вы откроете изображение с помощью приложения к галерее, оно откроется в ландшафтном режиме (телефон не знает правильной ориентации для фотографии).
И если вы поворачиваете телефон на портфолио в приложении камеры, значки (возьмите pic, focus и settings) не будут повернуты, попробуйте, чтобы на S2 или на любом устройстве поддерживалась пейзаж/портретная камера, эти значки будут повернуты.

Что я уверен, что приложение для камеры не поддерживает съемку в режиме пропорциональности.

Ответ 8

Я уже делал это для проекта, потому что у меня была такая же проблема (Android думает, что вы сделаете снимок только на пейзаж). То, что я делал, это определение ориентации телефона в то время, а затем поворот изображения. Он предполагает, что ориентация остается прежней, когда намерение получено, однако.

Ответ 10

Используйте его таким образом!

private static int exifToDegrees(int exifOrientation) {
    if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) {
        return 90;
    } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {
        return 180;
    } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {
        return 270;
    }
    return 0;
}

И в коде

Bitmap newImage = Bitmap.createBitmap(actualImage, 0, 0, width, height, matrix, true);

Simple!

Ответ 11

Что я делаю: сначала проверьте ориентацию изображения, сделанного камерой, используя данные метаданных, и если мы нашли это в портрете, мы должны повернуть изображение на 90 и отобразить в противном случае только отображение.

Для получения информации об ориентации изображения мы можем использовать интерфейс Exif. Что это!

Ответ 12

Простые ответы exiftodegree только последовательно работают, когда вы сделали снимок, и я использую его для этого. Для тех из вас, кто испытывает проблемы с выбором фотографии и правильной ориентацией, см. Мой ответ здесь: Ориентация изображения - Android