首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin图像压缩实现

Kotlin图像压缩实现
EN

Stack Overflow用户
提问于 2020-07-14 15:33:36
回答 1查看 1.7K关注 0票数 3

我以前的实现是在没有任何压缩的情况下,以JPEG格式将图像上传到Firebase存储

代码语言:javascript
复制
private fun sendToFirebase() {

        if (imgUri != null) {

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

            // code to upload and read image url
        }
    }

决定写一种图像压缩技术来压缩图像,然后上传到Firebase存储

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

新增加的压缩图像代码

  1. URI到位图

val位图= MediaStore.Images.Media.getBitmap(activity?.contentResolver,imgUri)

压缩位图的

  1. 方法

私有乐趣compressBitmap(位图:位图,质量:Int):位图{ val流= ByteArrayOutputStream() bitmap.compress(Bitmap.CompressFormat.WEBP,quality,stream) val byteArray = stream.toByteArray()返回BitmapFactory.decodeByteArray(byteArray,0,byteArray.size) }

  1. 位图压缩实现

compressBitmap(位图,80)

查询:如何将同一压缩图像上载到Firebase存储区

代码语言:javascript
复制
 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
        .....

    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-07-16 07:48:43

您似乎没有将任何东西传递到sendtoFirebase的函数中。我正在张贴代码,我已经做了成功上传。

你首先要压缩,这样你就需要这个;

代码语言:javascript
复制
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是对防火墙上传的调用。我正在将压缩的位图传递到函数中。上传功能如下:

在下面,mImageURI是一个配套的对象,它是为压缩而传递的URI的一部分。如果不想进行检查,可以删除下面的if语句

代码语言:javascript
复制
 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:意图?){ super.onActivityResult(requestCode,resultCode,data)

代码语言:javascript
复制
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK
        && data != null && data.getData() != null) {

            mImageUri = data.getData()!!

        image1.setImageURI(data.getData())


   }
}

在上面的image1中,是当前页面上显示所选图像的imageView。

希望这能有所帮助

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62898708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档