Android: Как определить ориентацию изображения (портретную или альбомную), выбранную из галереи при настройке изображения?
Я устанавливаю изображение на изображении, выбранном из галереи (альбом камеры). Если выбранное изображение имеет альбомную ориентацию, оно отображается отлично, но если изображение в портретном режиме (то есть изображение было нажато в портретном режиме), оно отображает изображение с вращением на 90 градусов. Теперь я пытаюсь выяснить ориентацию непосредственно перед настройкой изображения, но все изображения имеют такую же ориентацию и ту же ширину ширины. Вот мой код:
Uri selectedImage = intent.getData();
if (selectedImage != null) {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage);
int str = new ExifInterface(selectedImage.getPath()).getAttributeInt("Orientation", 1000);
Toast.makeText(this, "value:" + str, Toast.LENGTH_LONG).show();
Toast.makeText(this, "width:" + bitmap.getWidth() + "height:" + bitmap.getHeight(), Toast.LENGTH_LONG).show();
Ответы
Ответ 1
Используйте ExifInterface
для поворота изображения. Используйте этот метод, чтобы получить правильное значение для поворота захваченного изображения с камеры.
public 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.i("RotateImage", "Exif orientation: " + orientation);
Log.i("RotateImage", "Rotate value: " + rotate);
} catch (Exception e) {
e.printStackTrace();
}
return rotate;
}
И поместите этот код в метод результата Activity и получите значение для поворота изображения...
String selectedImage = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
filePath = cursor.getString(columnIndex);
cursor.close();
int rotateImage = getCameraPhotoOrientation(MyActivity.this, selectedImage, filePath);
Надеюсь, что это поможет.
Ответ 2
Это также работает для меня:
String[] orientationColumn = {MediaStore.Images.Media.ORIENTATION};
Cursor cur = getContentResolver().query(imageUri, orientationColumn, null, null, null);
int orientation = -1;
if (cur != null && cur.moveToFirst()) {
orientation = cur.getInt(cur.getColumnIndex(orientationColumn[0]));
}
Matrix matrix = new Matrix();
matrix.postRotate(orientation);
Ответ 3
if(bm.getWidth() > bm.getHeight())
{
Bitmap bMapRotate=null;
Matrix mat=new Matrix();
mat.postRotate(90);
bMapRotate = Bitmap.createBitmap(bm, 0, 0,bm.getWidth(),bm.getHeight(), mat, true);
bm.recycle();
bm=null;
imageDisplayView.setImageBitmap(bMapRotate);
}else
imageDisplayView.setImageBitmap(bm);
Ответ 4
Вот отличное решение, с которым я столкнулся: > fooobar.com/questions/12168/...
Однострочное решение:
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
или
Picasso.with(context).load("file:" + photoPath).into(imageView);
Это автоматически определит вращение и поместит изображение в правильной ориентации.
Picasso - очень мощная библиотека для обработки изображений в вашем приложении, включает в себя: сложные преобразования изображений с минимальным использованием памяти. Для загрузки может потребоваться секунда, но я просто поместил какой-то текст за изображение, в котором говорится "Загрузка изображения", и когда изображение загружается, оно покрывает текст.
Ответ 5
Другим решением является использование ExifInterface из библиотеки поддержки:
ExifInterface из библиотеки поддержки
Ответ 6
Использование kotlin и рассмотрение изменений в URI и EXIF в новых версиях Android:
var exif: ExifInterface? = null;
try {
when (Build.VERSION.SDK_INT) {
in Int.MIN_VALUE..24 -> exif = ExifInterface(imageUri.path)
else -> exif = ExifInterface(getContentResolver().openInputStream(data.extras.get("data")))
}
} catch (e: IOException) {
e.printStackTrace();
}
val orientation = exif?.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)
bmp = rotateBitmap(bmp, orientation ?: ExifInterface.ORIENTATION_NORMAL)
И функция rotateBitmap:
un rotateBitmap(bitmap: Bitmap, orientation: Int): Bitmap {
val matrix = Matrix()
when (orientation) {
ExifInterface.ORIENTATION_NORMAL -> return bitmap
ExifInterface.ORIENTATION_FLIP_HORIZONTAL -> matrix.setScale(-1f, 1f)
ExifInterface.ORIENTATION_ROTATE_180 -> matrix.setRotate(180f)
ExifInterface.ORIENTATION_FLIP_VERTICAL -> {
matrix.setRotate(180f)
matrix.postScale(-1f, 1f)
}
ExifInterface.ORIENTATION_TRANSPOSE -> {
matrix.setRotate(90f)
matrix.postScale(-1f, 1f)
}
ExifInterface.ORIENTATION_ROTATE_90 -> matrix.setRotate(90f)
ExifInterface.ORIENTATION_TRANSVERSE -> {
matrix.setRotate(-90f)
matrix.postScale(-1f, 1f)
}
ExifInterface.ORIENTATION_ROTATE_270 -> matrix.setRotate(-90f)
else -> return bitmap
}
try {
val bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
bitmap.recycle()
return bmRotated
} catch (e: OutOfMemoryError) {
e.printStackTrace()
return null
}
}
Ответ 7
Использование информации EXIF не надежно на некоторых устройствах Android. (Ориентация ExifInterface всегда возвращает 0)
Это работает для меня:
Повернуть растровое изображение
public static Bitmap rotateBitmap(Context context, Uri photoUri, Bitmap bitmap)
{
int orientation = getOrientation(context, photoUri);
if (orientation <= 0) {
return bitmap;
}
Matrix matrix = new Matrix();
matrix.postRotate(orientation);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);
return bitmap;
}
Получить ориентацию из MediaStore
private static int getOrientation(Context context, Uri photoUri)
{
Cursor cursor = context.getContentResolver().query(photoUri,
new String[]{MediaStore.Images.ImageColumns.ORIENTATION}, null, null, null);
if (cursor.getCount() != 1) {
cursor.close();
return -1;
}
cursor.moveToFirst();
int orientation = cursor.getInt(0);
cursor.close();
cursor = null;
return orientation;
}
Ответ 8
Эта работа для меня:
private String getOrientation(Uri uri){
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
String orientation = "landscape";
try{
String image = new File(uri.getPath()).getAbsolutePath();
BitmapFactory.decodeFile(image, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
if (imageHeight > imageWidth){
orientation = "portrait";
}
}catch (Exception e){
//Do nothing
}
return orientation;
}