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
и создать после этого растровое изображение с правильной ориентацией?