首页 > 解决方案 > 将图像选择器意图中的数据转换为位图(Kotlin)?

问题描述

我目前正在尝试将用户选择的任何图像保存到房间数据库中,看起来唯一的方法是首先将其保存为位图。但是,我不确定我会如何做到这一点。

这是我现在拥有的代码:它让用户选择一个图像并在之后将其显示在一个图像视图中。但是,我不知道如何将我data?.data的转换为位图。

如果这不是一个很好的问题,我深表歉意,我对处理 android 应用程序中的图像和图像类型非常陌生。任何帮助将不胜感激!

// Opens gallery when image button clicked, gets image
        view.image_et.setOnClickListener {
            readStorageTask()
            //Intent to pick image
            val intent = Intent(Intent.ACTION_PICK)
            intent.type = "image/*"
            startActivityForResult(intent, 1001)
        }

// Handle result of picked image
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (resultCode == Activity.RESULT_OK && requestCode == 1001) {
            preview_image.setImageURI(data?.data)
        }
    }

我已经看到一些类似于我的 StackOverflow 问题在 Java 中处理相同的问题,但我尝试过的问题对我不起作用。任何帮助将不胜感激!

标签: androidkotlinbitmap

解决方案


您可以在缓存目录中创建一个文件,然后创建位图

    if (data != null && data.data != null) {
        val uri = data.data!!
        val inputStream = requireContext().contentResolver.openInputStream(uri)
        val cursor = requireContext().contentResolver.query(uri, null, null, null, null)
        cursor?.use { c ->
          val nameIndex = c.getColumnIndex(OpenableColumns.DISPLAY_NAME)
          if (c.moveToFirst()) {
            val name = c.getString(nameIndex)
            inputStream?.let { inputStream ->
               // create same file with same name
               val file = File(requireContext().cacheDir, name)
               val os = file.outputStream()
                os.use {
                 inputStream.copyTo(it)
                 }
                val bitmap = BitmapFactory.decodeFile(file.absolutePath)
              }
            }
         }               
  }

推荐阅读