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上检查该路径,但在那里我失去了我的图像质量,这也是服务器的相同问题
1条答案
按热度按时间r3i60tvu1#
原始位图是纯图像数据,您可以将其转换为(大量)Base64而不会有任何损失--这只是表示相同数据的另一种方式。但调整位图大小会丢弃数据,将其压缩为JPEG(特别是在70%质量时)也是如此。
不管怎么说,你还是把这个小版本叫做“预览”,你确定这就是你所关心的数据吗?预览通常都比较小/细节比较少,这就是问题所在!老实说,你可能只是使用了一个更高质量的JPEG压缩级别(90或95)或者更好,如果可以的话,使用
Bitmap.CompressFormat.PNG
。这是一种无损格式,而且它会有更好的质量,特别是在非照片内容-文件大小会更大,但对于这样一个小图像可能不会有太大的区别。另外你调用
createScaledBitmap
的时候将过滤设置为 false。过滤是混合像素以更好的质量来调整大小,它对于以任意比例缩小东西尤其重要。设置为 true,它看起来会更好。