Захваченная фотография ориентация меняется в Android
Я открываю приложение камеры одним нажатием кнопки. И отображение захваченного фото в следующем упражнении. Но захваченное фото поворачивается на 90 градусов. Когда я отображаю изображение в виде после его захвата, его ориентация всегда в альбомной ориентации. Почему фотография не отображается на портрете, как на фотографии, сделанной в портретном режиме?
Нажатие кнопки:
Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(APP_DIR+"/latest.png")));
startActivityForResult(i, CAPTURE_PHOTO_CONSTANT);
Внутри на Actvityresult:
bmp = BitmapFactory.decodeFile(APP_DIR+"/latest.png");
startActivity(new Intent(this, DisplayActivity.class));
Отображение захваченного фото:
photoViewRelativeLayout.setBackgroundDrawable(new BitmapDrawable(getResources(), CaptureActivity.bmp));
4 ответа
У меня была та же проблема в основном с телефонами Samsung. Видимо, телефоны Samsung установили тег ориентации EXIF, а не вращение отдельных пикселей. Чтение растрового изображения с помощью BitmapFactory не поддерживает этот тег. Как я обнаружил, решение этой проблемы заключалось в использовании ExifInterface в onActivityResult Метод действия. Который проверяет ориентацию, связанную с URI захваченного изображения с камеры.
int rotate = 0;
try {
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(Common.TAG, "Exif orientation: " + orientation);
} catch (Exception e) {
e.printStackTrace();
}
/****** Image rotation ****/
Matrix matrix = new Matrix();
matrix.postRotate(orientation);
Bitmap cropped = Bitmap.createBitmap(scaled, x, y, width, height, matrix, true);
вызовите этот метод с путем к растровому изображению и растровому изображению
getRotateImage(path, bm)
Добавьте метод getRotateImage как статический в любой класс утилит и используйте его.
public static Bitmap getRotateImage(String photoPath, Bitmap bitmap) throws IOException {
ExifInterface ei = new ExifInterface(photoPath);
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_UNDEFINED);
Bitmap rotatedBitmap = null;
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
rotatedBitmap = rotateImage(bitmap, 90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotatedBitmap = rotateImage(bitmap, 180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotatedBitmap = rotateImage(bitmap, 270);
break;
case ExifInterface.ORIENTATION_NORMAL:
default:
rotatedBitmap = bitmap;
}
return rotatedBitmap;
}
public static Bitmap rotateImage(Bitmap source, float angle) {
Matrix matrix = new Matrix();
matrix.postRotate(angle);
return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(),
matrix, true);
}
Пожалуйста, используйте вместо Glide. Он фиксирует саму ориентацию и не зависит от используемого вами мобильного телефона. Вот образец
Glide.with(_c).load(horizontalList.get(position).imagePath).into(holder.img_injury);
Я получил это несколько работает. Когда я делаю фото в ландшафтном режиме, все работает отлично, как и раньше. Если я делаю фотографию в портретном режиме, мне нужно перевернуть камеру, и картинка выглядит хорошо. Если вы заметили, я немного изменил ваш код, добавив "ExifInterface" перед каждой ориентацией. Я использовал следующий код:
try {
ExifInterface exif = new ExifInterface(filename);
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
int rotate = 0;
switch(orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
rotate-=90;break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate-=90;break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotate-=90;break;
}
Log.d("Fragment", "EXIF info for file " + filename + ": " + rotate);
} catch (IOException e) {
Log.d("Fragment", "Could not get EXIF info for file " + filename + ": " + e);
}
Вы можете просто повернуть его
получить ориентацию изображения, полученного с помощью этого кода в onActvityresult ....
File imageFile = new File(imageUri.toString());
ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath());
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
int rotate = 0;
switch(orientation) {
case ORIENTATION_ROTATE_270:
rotate-=90;break;
case ORIENTATION_ROTATE_180:
rotate-=90;break
case ORIENTATION_ROTATE_90:
rotate-=90;break
}