Я пишу приложение для 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, но изображение загружается в обратном порядке, и мой матричный код не вызывается.
Какое рекомендуемое решение или какое-либо решение этой проблемы?