Nano Hash - криптовалюты, майнинг, программирование

получить ориентацию изображения из MediaStore.Images.Media.DATA

у меня есть MediaStore.Images.Media.DATA uri для изображения, как я могу получить MediaStore.Images.ImageColumns.ORIENTATION, используя этот uri? Я получаю исключение NullPointerException.

Ниже приведен мой код,

private  int getOrientation(Context context, Uri photoUri) {

Log.v("orientatioon", "not crashed01");
Cursor cursor = context.getContentResolver().query(photoUri,
        new String[] { MediaStore.Images.ImageColumns._ID,MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null);
Log.v("orientatioon", "not crashed02");


cursor.moveToFirst();
Log.v("orientatioon", "not crashed 03");
int i=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.ORIENTATION));
Log.v("orientatioon", ""+i);
cursor.close();
return i;
}

Я получаю NullPointerException в строке кода cursor.moveToFirst().


Ответы:


1

Используйте этот method, чтобы получить ориентацию.

public static int getExifOrientation(String filepath) {// YOUR MEDIA PATH AS STRING
        int degree = 0;
        ExifInterface exif = null;
        try {
            exif = new ExifInterface(filepath);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        if (exif != null) {
            int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
            if (orientation != -1) {
                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;
                }

            }
        }
        return degree;
    }
13.01.2014

2

На самом деле оба ответа верны, и их must следует использовать одновременно.

/**
 * @return 0, 90, 180 or 270. 0 could be returned if there is no data about rotation
 */
public static int getImageRotation(Context context, Uri imageUri) {
    try {
        ExifInterface exif = new ExifInterface(imageUri.getPath());
        int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);

        if (rotation == ExifInterface.ORIENTATION_UNDEFINED)
            return getRotationFromMediaStore(context, imageUri);
        else return exifToDegrees(rotation);
    } catch (IOException e) {
        return 0;
    }
}

public static int getRotationFromMediaStore(Context context, Uri imageUri) {
    String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.ORIENTATION};
    Cursor cursor = context.getContentResolver().query(imageUri, columns, null, null, null);
    if (cursor == null) return 0;

    cursor.moveToFirst();

    int orientationColumnIndex = cursor.getColumnIndex(columns[1]);
    return cursor.getInt(orientationColumnIndex);
}

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;
    } else {
        return 0;
    }
}
01.06.2015
  • Очень красивый и чистый код. спасибо @Fox в носках. Это не работает с устройством 5.1.1 :( 04.12.2015
  • @Manisha На каком устройстве у вас возникла проблема? Только что протестировал этот код на Samsung Note 4 с 5.1.1. 05.12.2015
  • в настоящее время я тестирую Samsung Edge 6 с 5.1.1 05.12.2015
  • Из всех ответов, которые были повсюду, именно этот действительно работает в 2016 году. Отличный материал. 08.08.2016
  • вам нужно закрыть курсор перед возвратом? 09.10.2017
  • Это работало на Android 7.0 только тогда, когда вместо создания ExifInterface с путем я создал его с InputStream, открытым для этого URI, используя ContentResolver. 14.03.2018
  • Интересно, что вы сначала выбираете чтение из файла Exif, а затем возвращаетесь к MediaStore. Вы не доверяете медиа-магазину? (Это намного быстрее, чем использование ExifInterface) 25.02.2021

  • 3

    Пожалуйста, сделайте так. попробуй

     final Uri imageUri = data.getData();
    
                            String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.ORIENTATION};
    
                            Cursor cursor = getContentResolver().query(imageUri, columns, null, null, null);
    
    
                            if (cursor == null) {
    
                                return;
                            }
    
                            cursor.moveToFirst();
    
                            int columnIndex = cursor.getColumnIndex(columns[0]);
                            int orientationColumnIndex = cursor.getColumnIndex(columns[1]);
    
    
                            String filePath = cursor.getString(columnIndex);
                            int orientation = cursor.getInt(orientationColumnIndex);
    
                            Log.d(TAG, "got image orientation "+orientation);
    
    13.01.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..