gpt4 book ai didi

android - Kotlin 图像压缩实现

转载 作者:行者123 更新时间:2023-12-02 12:19:03 34 4
gpt4 key购买 nike

我的旧实现以 JPEG 格式将图像上传到 Firebase 存储而不进行任何压缩

private fun sendToFirebase() {

if (imgUri != null) {

val fileRef = storageRef!!.child(username+ ".jpg")

....

// code to upload and read image url
}
}

决定写一个图像压缩技术来压缩图像然后上传到 Firebase Storage

结果:实现图像压缩技术,见下文

新增压缩图片的代码

  1. URI 到位图

    val bitmap = MediaStore.Images.Media.getBitmap(activity?.contentResolver, imgUri)
  2. Bitmap的压缩方法

     private fun compressBitmap(bitmap: Bitmap, quality:Int):Bitmap{
    val stream = ByteArrayOutputStream()
    bitmap.compress(Bitmap.CompressFormat.WEBP, quality, stream)
    val byteArray = stream.toByteArray()
    return BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)
    }
  3. 位图压缩实现

     compressBitmap(bitmap, 80)

查询:如何将同一张压缩图片上传到Firebase存储

 private fun sendToFirebase() {

if (imgUri != null) {

// code to convert uri to bitmap <start>
val bitmap = MediaStore.Images.Media.getBitmap(activity?.contentResolver, imgUri)

compressBitmap(bitmap, 80)
// code to convert uri to bitmap <end>


// old implementation
.....

}
}

最佳答案

您似乎没有将任何内容传递到您的 sendtoFirebase 函数中。我正在发布我为成功上传而完成的代码。

你首先考虑压缩,所以你需要这个;

private fun compressBitmap(bitmap: Bitmap, quality: Int): Bitmap {

val stream = ByteArrayOutputStream()

bitmap.compress(Bitmap.CompressFormat.WEBP,quality,stream)

val byteArray = stream.toByteArray()

arrayByte = byteArray


uploadFile(arrayByte)


return BitmapFactory.decodeByteArray(byteArray,0,byteArray.size)


}

在上面,uploadFile 是对 firebase 上传的调用。我将压缩位图传递给函数。上传功能如下所示:

mImageURI 是一个伴随对象,它是为压缩传递的 URI 的一部分。如果你不想做检查,你可以删除下面的 if 语句

 private fun uploadFile(data:ByteArray) {


if (mImageUri != null){

val storageref = imageref.child("put your image id here")

storageref.putBytes(data).addOnSuccessListener {

Handler().postDelayed({

progressbar.setProgress(0)
Toast.makeText(activity, "Upload Successful", Toast.LENGTH_LONG).show()

}

, 1000)

}.addOnFailureListener{e->

Toast.makeText(activity,e.message,Toast.LENGTH_LONG).show()
}.addOnProgressListener {taskSnapshot ->

val progress = (100.0 * taskSnapshot.bytesTransferred/taskSnapshot.totalByteCount)

progressbar.setProgress(progress.toInt())

}

}
else if(mImageUri == null) {
Toast.makeText(activity,"No File Selected",Toast.LENGTH_LONG).show()

}
}

你不需要有上面的进度条。如果文件很大,用户必须查看上传进度,这是一个很好的视觉效果。

你真的只需要确保将 data 传递到 .putbytes



编辑:对于你的 onActivity 结果,如果你的代码与我的相似,那么使用;

覆盖乐趣 onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK
&& data != null && data.getData() != null) {

mImageUri = data.getData()!!

image1.setImageURI(data.getData())


}
}

上面image1是当前页面的一个imageView,用来显示选中的图片。

希望对你有帮助

关于android - Kotlin 图像压缩实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62898708/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com