我尝试通过从我的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
具有正确方向的位图获取正确的字节和图像方向并在之后创建?