it-roy-ru.com

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();

portrait modelandscape mode

30
sarabhai05

Используйте 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);

Надеюсь это поможет..

53
Deepak

Это также работает для меня:

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);
5
sarabhai05
                      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);
3
ultimate

Вот отличное решение, с которым я столкнулся для этого:> https://stackoverflow.com/a/34241250/8033090

Одноканальное решение:

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

или же

Picasso.with(context).load("file:" + photoPath).into(imageView);

Это автоматически определит поворот и поместит изображение в правильную ориентацию

Picasso - очень мощная библиотека для обработки изображений в вашем приложении, включающая в себя: Сложные преобразования изображений с минимальным использованием памяти. Загрузка может занять секунду, но я просто помещаю некоторый текст позади представления изображения, который говорит: «Загрузка изображения», и когда изображение загружается, оно покрывает текст.

1
Andrew Moreau

Другое решение - использовать ExifInterface из библиотеки поддержки: ExifInterface из библиотеки поддержки

0
lucasddaniel