在 Android Studio 中从用户那里获取图片并进行编码,以便可以将其存储在数据库中

Posted

技术标签:

【中文标题】在 Android Studio 中从用户那里获取图片并进行编码,以便可以将其存储在数据库中【英文标题】:Getting picture from user in Android studio and encoding so it can be stored in the DB 【发布时间】:2021-12-31 12:37:21 【问题描述】:

我从用户那里得到一张图片,该图片被转换为位图。然后我将位图转换为字节数组并通过 JSON 发送以存储在数据库中。然后,当用户启动特定活动时,我希望从数据库中检索图像并显示给用户。

在应用程序中,用户可以发布带有标题、描述和图像的帖子。我希望将这三个变量存储在数据库中,以便其他人查看帖子时,他们能够看到所有内容。此外,图像将作为 blob 存储在数据库中,我只需使用 JSON 将数据发送到处理与数据库的所有通信的后端应用程序。

我的问题是,我得到的位图似乎是对设备 android.graphics.Bitmap@324a72b 上某些内存的引用,尽管我选择了相同的图像,但每次运行应用程序时它都会发生变化。我希望能够检索实际的位图,以便将其存储在数据库中。我也没有将其用作存储图像的网络服务器,因为它是一个较小的项目。

b.buttonNewItemUpImg.setOnClickListener 
            val openGalleryIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
            startActivityForResult(openGalleryIntent, ResultLoadImage)
        
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
        super.onActivityResult(requestCode, resultCode, data)

        if (requestCode == ResultLoadImage)
            if (resultCode == Activity.RESULT_OK)
                var temp = MediaStore.Images.Media.getBitmap(this.contentResolver, data!!.getData())
                bitmap = getResizedBitmap(temp!!, maxImageSize)
                b.imageView.setImageURI(data!!.getData())
            
        
    

getResizedBitmap() 函数只是让图像变小。

【问题讨论】:

get an image from an user which is converted into a bitmap. I then convert the bitmap to a an byte array 我想你从用户那里得到了一个 jpg 文件。如果您从中制作位图,然后将其压缩为字节数组,则字节数组包含 jpg 文件的字节。那么为什么要采取所有这些不必要的行动呢?您也不需要 json 将数组放入数据库中,但可以将其存储为 blob。 Getting picture from user .... Ahum... 没有用户向您发送图片。您让应用程序的用户使用 ACTION_PICK 选择图像。相当混乱的标题。 抱歉解释。我现在意识到这还不够。在应用程序中,用户可以发布带有标题、描述和图像的帖子。我希望将这三个变量存储在数据库中,以便其他人查看帖子时,他们能够看到所有内容。此外,图像将作为 blob 存储在数据库中,我只需使用 JSON 将数据发送到处理与数据库的所有通信的后端应用程序。 现在,如果您将该评论的文本放在帖子的开头... 【参考方案1】:

如https://***.com/a/57576381/6359367中所述

使用这个

      var temp = ImageDecoder.createSource(this.getContentResolver(), data!!.getData())
      bitmap = ImageDecoder.decodeBitmap(temp);

注意这段代码是 java 我试图将它改编为 kotlin 你可能需要稍微调整一下

【讨论】:

【参考方案2】:

您应该将图像复制到应用程序的本地存储中,然后将这些复制图像的路径存储到数据库中,而不是将整个图像存储在数据库中,以便以后检索图像。

获取选中图片后复制图片到应用本地存储uri

//creating an image file in the app's local storage
val dir = requireActivity().getDir(FOLDER_TO_SAVE, Context.MODE_PRIVATE).path
val copiedImageFile = File(dir, UUID.randomUUID().toString() + ".jpg")
val copiedImageUri = Uri.fromFile(copiedImageFile)

//copying selected image to the local storage
data!!.getData().path?.let 
    File(it).copyTo(copiedImageFile)

使用uri获取上述复制图片的路径

copiedImageUri.path.?.let
     val copiedImagePath = "file://$it"
     //now save this path to your database

使用此保存的图像路径检索任何片段或活动中的图像。

【讨论】:

这可行,但图像需要存储在数据库中,以便其他用户可以访问并查看图像。 其他用户是什么意思?应用的数据库和本地存储只能由应用访问。 我不是指应用程序数据库。我有一个外部数据库,我希望在其中存储这些图像,以便在其他用户启动将显示这些图像的活动时检索它们。

以上是关于在 Android Studio 中从用户那里获取图片并进行编码,以便可以将其存储在数据库中的主要内容,如果未能解决你的问题,请参考以下文章

如何在android studio中从这种类型的json数组中获取价值?

从后台进程打开窗口并在 WPF 中从用户那里获取输入

如何使用firebase在android studio中从一个用户向另一个用户发送通知[重复]

如何管理我在同一张卡中从用户那里获取的不同尺寸的图像?

在 Android Studio 中从 JSON 向谷歌地图添加标记

在 ListView 的自定义适配器中从 URL 加载图像(Android Studio)