如何将位图图像转换为base64而不损失图像质量android

svmlkihl  于 2023-03-21  发布在  Android
关注(0)|答案(1)|浏览(287)
ivPersonImageA.setOnClickListener {
        val mIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        startActivityForResult(
            mIntent,
            PERSON_CODE
        )
    }

@Deprecated("Deprecated in Java")
override  fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == PERSON_CODE) {
        if (resultCode == RESULT_OK) {
            val  imageBitmap = data?.extras?.get("data") as Bitmap
            personAvImageA.setImageBitmap(imageBitmap)
            mPesrsonBase64 = encodeImage(imageBitmap)
            Log.e("mPersonBase64", mPesrsonBase64)
        }
    }
}



private fun encodeImage(bitmap: Bitmap): String {
    val previewWidth = 150
    val previewHeight = bitmap.height * previewWidth / bitmap.width
    val previewBitmap = Bitmap.createScaledBitmap(bitmap, previewWidth, previewHeight, false)
    val byteArrayOutputStream = ByteArrayOutputStream()
    previewBitmap.compress(Bitmap.CompressFormat.JPEG, 70, byteArrayOutputStream)
    val bytes = byteArrayOutputStream.toByteArray()
    return Base64.encodeToString(bytes, Base64.CRLF)
}

这是我所有的代码,当我运行我的代码时,我选中了我的运行框,在那里我得到了basee64路径,然后在website上检查该路径,但在那里我失去了我的图像质量,这也是服务器的相同问题

r3i60tvu

r3i60tvu1#

原始位图是纯图像数据,您可以将其转换为(大量)Base64而不会有任何损失--这只是表示相同数据的另一种方式。但调整位图大小会丢弃数据,将其压缩为JPEG(特别是在70%质量时)也是如此。
不管怎么说,你还是把这个小版本叫做“预览”,你确定这就是你所关心的数据吗?预览通常都比较小/细节比较少,这就是问题所在!老实说,你可能只是使用了一个更高质量的JPEG压缩级别(90或95)或者更好,如果可以的话,使用Bitmap.CompressFormat.PNG。这是一种无损格式,而且它会有更好的质量,特别是在非照片内容-文件大小会更大,但对于这样一个小图像可能不会有太大的区别。

另外你调用createScaledBitmap的时候将过滤设置为 false。过滤是混合像素以更好的质量来调整大小,它对于以任意比例缩小东西尤其重要。设置为 true,它看起来会更好。

Bitmap.createScaledBitmap(bitmap, previewWidth, previewHeight, true)

相关问题