0

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

4

0 回答 0