Ориентация изображения от цели галереи/камеры
Я получаю изображение к своему приложению из намерения камеры/галереи. Во многих телефонах изображение, которое я прочитал из намерения /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 думает, что вы сделаете снимок только на пейзаж). То, что я делал, это определение ориентации телефона в то время, а затем поворот изображения. Он предполагает, что ориентация остается прежней, когда намерение получено, однако.
Ответ 9
Это похоже на ту же проблему, которая была решена в этом вопросе:
Android: растровые изображения, загруженные из галереи, поворачиваются в ImageView
Ответ 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