Intereting Posts
Как добавить фоновое изображение в действие? Какие разрешения не остаются при обновлении до целевогоSdk 23 или Android 6? HTML 5 тип ввода «число» с шагом = «any» => Нет разделителя на десятичной основе в Chrome Soft-Keyboard Как приостановить, но не заморозить выполнение Android? Как остановить воспроизведение текущей мелодии? Android Studio занимает слишком много времени, чтобы выполнить приложение. Интеграция Facebook в приложение для Android Как я могу наложить кнопку «назад» и «следующий» в окне «выбрать сеть Wi-Fi»? Как открыть счетчик одним щелчком мыши, когда открыт другой счетчик Показывать прогресс при загрузке изображения с сервера в изображение Как вызвать метод каждый раз при просмотре активности? Результаты Limit Realm Импортирование библиотек jar в андроид-студию NotificationCompat не может быть разрешен для типа Используйте только графические элементы XHDPI в приложении Android?

Как получить поворот эскиза

Я создаю своего рода приложение «Галерея», которое отображает все изображения в сетке.

Проблема в том, что некоторые изображения не отображаются в правильной ориентации.

Вот код для извлечения эскизов

final String[] projection = { MediaStore.Images.Thumbnails.DATA, MediaStore.Images.Thumbnails.IMAGE_ID }; //query the thumbnails provider Cursor thumbnailsCursor = context.getContentResolver().query(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, null, null, null); if (thumbnailsCursor.moveToFirst()) { do { //get the thumbnail path fullPath = thumbnailsCursor.getString(fullPathColumnIndex); thumbnailUri = Uri.parse(fullPath); //add the uri to the list thumbnailsList.add(thumbnailUri); } while (thumbnailsCursor.moveToNext()); thumbnailsCursor.close(); 

Внутри getView() BaseAdapter я использую библиотеку загрузчика изображений Picasso для отображения миниатюры, но иногда ориентация неверна.

 Picasso.with(context).load(new File(photoItem.thumbnail.getPath())).noFade().into(holder.photoImageView); 

Я попытался запросить реальные фотоданные и получить ориентацию, но процесс слишком медленный (пару секунд), а отображаемые изображения слишком велики.

Учитывая идентификатор изображения, вы можете запросить MediaStore, чтобы получить путь к исходному изображению, а затем захватить exif для ориентации оттуда.

Этот процесс довольно быстрый и обычно занимает всего несколько миллисекунд.

  Cursor cursor = CustomApplication .getContext() .getContentResolver() .query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] {MediaStore.Images.Media.DATA}, MediaStore.Images.Media._ID + "=?", new String[] {"" + PHOTO_ID}, null); if (cursor != null && cursor.getCount() > 0) { cursor.moveToFirst(); String fullPath = cursor.getString(0); cursor.close(); ExifInterface exif = new ExifInterface(fullPath); int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); //ROTATE AND FLIP YOUR THUMBNAIL AS NEEDED BASED ON exifOrientation } 

Я обнаружил, что вы можете применять пользовательские преобразования для своей задачи загрузки в picasso lib.

Здесь это решение .

При этом метод преобразования использует MATRIX так же, как другие дали ansewer ..

Я еще не проверил.

Вот правильное решение. Вы можете запросить данные ориентации из MediaStore, чтобы использовать MediaStore.Images.Media.ORIENTATION, чтобы получить степень ориентации.

  final String[] projection = { MediaStore.Images.Thumbnails.DATA, MediaStore.Images.Thumbnails.IMAGE_ID, MediaStore.Images.Media.ORIENTATION }; Cursor thumbnailsCursor = context.getContentResolver().query(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, null, null, null); if (thumbnailsCursor.moveToFirst()) { do { int orientationColumnIndex = thumbnailsCursor.getColumnIndex(MediaStore.Images.Media.ORIENTATION); int orientation = cur.getInt(orientationColumnIndex); //do what you want to do with orientation value }while (thumbnailsCursor.moveToNext()); thumbnailsCursor.close(); 

Даст вам ориентацию в градусах.

Вы можете использовать класс ExifInterface следующим образом:

 int originalOrientation = ExifInterface.ORIENTATION_NORMAL; try { ExifInterface exif = new ExifInterface(photoItem.thumbnail.getPath().toString()); originalOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); } catch (IOException e) { e.printStackTrace(); } 

Затем вы можете проверить, вращается ли он и выполнять любую логику (например, прохождение угла поворота к запросу Пикассо).

 if (originalOrientation == ExifInterface.ORIENTATION_ROTATE_90 || originalOrientation == ExifInterface.ORIENTATION_ROTATE_270) { //do something } 

Это метод, который я использую, и я никогда не замечал никакого влияния на производительность.

 public static float getOrientationValue(String location) { ExifInterface exif = null; try { exif = new ExifInterface(new File(location).getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); } int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int rotate = 0; switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_270: rotate += 90; case ExifInterface.ORIENTATION_ROTATE_180: rotate += 90; case ExifInterface.ORIENTATION_ROTATE_90: rotate += 90; } return rotate; } 

или

  public static int getOrientation(Context context, Uri photoUri) { /* it's on the external media. */ Cursor cursor = context.getContentResolver().query(photoUri, new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null); if (cursor.getCount() != 1) { return -1; } cursor.moveToFirst(); return cursor.getInt(0); }