ExifInterface возвращает неправильную ориентацию (потому что он хранит несколько конфликтующих атрибутов) - PullRequest
0 голосов
/ 23 мая 2018

Я пишу приложение для Android, которое извлекает фотографии из галереи.Я обнаружил, что некоторые фотографии, например панорама, сделанная Galaxy S7 в левом направлении, выводятся встроенным приложением камеры в виде файла «ненормализованного JPEG», что означает, что изображение перевернуто (или даже вертикально дляпейзажная панорама на Galaxy S5), но она содержит инструкции в данных EXIF, которые зритель должен исправить.

Поэтому я прочитал на ExifInterface и реализовал код для нормализации изображений:

                ExifInterface exif = new ExifInterface(file.toString());
                int orig = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
                if (orig != -1 && orig != ExifInterface.ORIENTATION_NORMAL) {
                    orientation = orig;
                    exif.setAttribute(ExifInterface.TAG_ORIENTATION, String.valueOf(ExifInterface.ORIENTATION_NORMAL));
                    exif.saveAttributes();
                }

...

        Matrix matrix = null;
        if (orientation != ExifInterface.ORIENTATION_NORMAL) {
            matrix = new Matrix();
            switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_90:   matrix.postRotate(90); break;
                case ExifInterface.ORIENTATION_ROTATE_180:  matrix.postRotate(180); break;
                case ExifInterface.ORIENTATION_ROTATE_270:  matrix.postRotate(-90); break;
            }
        }

... и т. Д.

Однако на Galaxy S7 мой код не работает.После некоторой отладки и углубления в системный исходный код я обнаружил, что объект ExifInterface хранит несколько конфликтующих значений для атрибута «Ориентация», и он возвращает неправильное значение.Правильное значение (т. Е. 3) хранится в exif.mAttributes [4] (соответствует ли это группе IFD_THUMBNAIL_TAGS?), А неверное значение (т. Е. 1) хранится в exif.mAttributes [0] (соответствует ли это IFD_TIFF_TAGS?),Поэтому exif сообщил, что это ORIENTATION_NORMAL, но изображение загружается в обратном порядке, и мой матричный код не вызывается.

Какое рекомендуемое решение или какое-либо решение этой проблемы?

...