【问题标题】:Convert data from image picker intent into bitmap (Kotlin)?将图像选择器意图中的数据转换为位图(Kotlin)?
【发布时间】:2020-12-21 05:02:20
【问题描述】:

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

这是我现在拥有的代码:它让用户选择一个图像并在之后将其显示在一个图像视图中。但是,我不知道如何将我的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 中处理相同的问题,但我尝试过的问题对我不起作用。任何帮助将不胜感激!

【问题讨论】:

  • 无需创建位图。您可以使用此类 gist.github.com/jaisoni/4d4e20409849dd3cfa12ee15895124a6 查找图像的实际路径,并使用 Picasso 或其他库从实际路径显示预览
  • @JaiprakashSoni 感谢您的评论!我以前见过一些这样的事情,但我希望图像保留在我的应用程序中,即使实际图像已从用户的手机中删除。

标签: android kotlin bitmap


【解决方案1】:

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

    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)
              }
            }
         }               
  }

【讨论】:

    【解决方案2】:

    为获取的uri打开一个输入流,然后使用BitmapFactory.decodeStream()。

    在 Java 中:

    InputStream is = getContentResolver().openInputStream(data.getData());
    
    Bitmap bitmap = BitmapFactory.decodeStream(is);
    

    就是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多