Ответ 1
Отказанный фрагмент, который я использовал и применял в моем проекте, не является проблемой в моих обстоятельствах.
Для всех устройств (Galaxy Note, Galaxy S III, Galaxy Nexus, Galaxy Ace II, Nexus S), которые я использовал для тестирования, info.Orientation
все возвращают 270 на фронтальную камеру и 90 на задней камере.
После нескольких обсуждений с вопросом рейзера я обнаружил, что неправильно понял вопросы, поэтому я разделяю ответ на две части.
Для неправильной ориентации в предварительном просмотре камеры, пожалуйста, обратитесь к этому решению:
Решение для неправильной ориентации в предварительном просмотре камеры:
Сначала убедитесь, что info.Orientation
вернет 270 на фронтальную камеру, 90 на задней камере.
Затем попробуйте настроить режим предварительного просмотра камеры (или аналогичный класс, который обрабатывает предварительный просмотр), в альбомную.
Таким образом, когда вы просматриваете код, вы найдете:
degree = 90
для ориентации экрана, info.Orientation = 270
для передней камеры. Затем вы получите result = (270 - 90 + 360) % 360
, result = 180
, что означает, что он будет поворачивать часы 180 для просмотра передней камеры, что позволит исправить проблему перевернутой передней камеры.
Решение для неправильной ориентации в результатах фотосъемки камеры:
Если этот info.Orientation
применим к вам, проблема может быть:
- Для некоторых устройств Samsung (или других) (например, Galaxy Note, Galaxy SIII) камера будет записывать только Ориентировочный тег вместо вращения реальных пикселей.
- Если вы используете переднюю камеру и используете вышеприведенный код, она отображает предварительный просмотр с правильной ориентацией, но при отображении снимка будет отображаться изображение "вверх ногами".
Решение:
/**
*
* Get the orientation from EXIF
* @param filepath
* @return orientation
*/
public int getExifOrientation(String filepath) {
int degree = 0;
ExifInterface exif = null;
try {
exif = new ExifInterface(filepath);
} catch (IOException ex) {
Log.e("EXIF info", "cannot read exif", ex);
}
if (exif != null) {
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
if (orientation != -1) {
// We only recognize a subset of orientation tag values.
switch(orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
}
} else {
degree = 1;
}
Log.i("EXIF info", "Orientation degrees: " + degree);
return degree;
}
Тогда
if (isFromCamera) {
if (fromFrontCam) {
// try change here if the orientation still wrong, -90 means rotate counter-clockwise 90 degrees.
matrix.preRotate(-90);
} else {
matrix.preRotate(90);
}
} else {
// read EXIF data
getExifOrientation(path)
// don't forget to handle the situation that some devices won't write exif data
matrix.preRotate(degree);
}