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