BitmapFactory.decodeByteArray() работает некорректно после использования ExifInterface

Я пытаюсь добавить простую функциональность с получением изображения из галереи или с камеры в моем Androidприложение. И все работает нормально, я успешно получаю uriизображения и после этого хотите показать это изображение пользователю. И этот код хорошо работает:

private fun showImageToUser(uri: Uri) {
    val inputStream = contentResolver?.openInputStream(uri)
    val bytes = inputStream?.readBytes() ?: return
    val bitmapOriginal = BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
    // show bitmap in ImageView...
}

Затем при необходимости я хочу повернуть изображение (например, после камеры все изображения поворачиваются на 90 градусов). Для этого я использую ExifInterface (из androidx.exifinterface:exifinterface:1.3.1). Но есть кое-что странное. В этом коде:

private fun showImageToUser(uri: Uri) {
        val inputStream = contentResolver?.openInputStream(uri)

        val exifInterface = ExifInterface(inputStream ?: return)
        val rotation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)

        val bytes = inputStream.readBytes()

        val bitmapOriginal = BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
        val bitmapRotated = bitmapOriginal.rotateImageIfRequired(rotation) // simple logic for rotating in rotateImageIfRequired method...
    }

в bitmapOriginal всегда null. Как видите, я создаю exifInterface объект до inputStream.readBytes(). Если я поменяю их местами и попытаюсь запустить следующий код:

private fun showImageToUser(uri: Uri) {
    val inputStream = contentResolver?.openInputStream(uri)
    val bytes = inputStream?.readBytes() ?: return

    val exifInterface = ExifInterface(inputStream)
    val rotation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)

    val bitmapOriginal = BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
    val bitmapRotated = bitmapOriginal.rotateImageIfRequired(rotation)
} 

тогда bitmapOriginal не будет null, но rotation ценность всегда будет ORIENTATION_UNDEFINED.

Итак, что я делаю не так? Как правильно получить байты и ориентацию изображения из uri и создать после этого растровое изображение с правильной ориентацией?

0 ответов

Другие вопросы по тегам