Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Kotlin图像压缩的实现_Android_Firebase_Kotlin_Image Compression - Fatal编程技术网

Android Kotlin图像压缩的实现

Android Kotlin图像压缩的实现,android,firebase,kotlin,image-compression,Android,Firebase,Kotlin,Image Compression,我以前的实现是以JPEG格式将图像上载到Firebase存储,无需任何压缩 private fun sendToFirebase() { if (imgUri != null) { val fileRef = storageRef!!.child(username+ ".jpg") .... // code to upload and read image url

我以前的实现是以JPEG格式将图像上载到Firebase存储,无需任何压缩

private fun sendToFirebase() {

        if (imgUri != null) {

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

            // code to upload and read image url
        }
    }
决定编写一种图像压缩技术来压缩图像,然后上传到Firebase存储

结果:实现了图像压缩技术,如下所示

新添加的压缩图像的代码

  • 位图的URI

    val bitmap = MediaStore.Images.Media.getBitmap(activity?.contentResolver, imgUri)
    
  • 位图压缩方法

     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)
     }
    
  • 位图压缩的实现

     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
            .....
    
        }
    }
    
    private fun sendToFirebase(){
    if(imgUri!=null){
    //将uri转换为位图的代码
    val bitmap=MediaStore.Images.Media.getBitmap(活动?.contentResolver,imgUri)
    压缩位图(位图,80)
    //将uri转换为位图的代码
    //旧实现
    .....
    }
    }
    
    对于
    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上传的调用。我正在将压缩的位图传递到函数中。上传功能如下所示:

    在下面的
    中,mimageri
    是一个伴随对象,它是传递给压缩的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()
    
        }
    }
    
    您不需要有上面的进度条。如果文件很大,用户必须看到上传的进度,这只是一个很好的视觉效果

    您只需确保将
    数据
    传递到
    .putbytes



    编辑:如果你的代码与我的代码相似,请使用

    重写activityResult(请求代码:Int,结果代码:Int,数据:Intent?){ super.onActivityResult(请求代码、结果代码、数据)

    在上面的图像中,1是当前页面上的图像视图,用于显示所选图像


    希望这有助于

    为什么不使用?谢谢Waseem。我尽了最大努力实现了同样的功能,几乎完成了,但没有得到必须在ActivityResult(…)>compressBitmap()中写入的内容。请查看我的更新部分above@Android,请参阅上面我编辑的文章,您不需要调用
    compress位图()
    内置
    onActivityResult
    。上传时将其作为按钮的一部分调用,例如,有一个上传按钮。按下时,第一个功能应该是压缩图像,然后压缩功能本身将在压缩完成后调用上传。希望这是合理的。为什么要分配arrayByte=byteArray?为什么n不仅仅是上传文件(byteArray)?我遗漏了什么吗?@Luis,我想你是对的。在这一点上,它在我的应用程序中对我有效,所以现在不会更改它:)是的,我简化了这一点,而且如果有人也到了这里,我必须在主函数上启动变量var-bitmap:bitmap?=null,并在我使用的onCreate中使用“YouButtonNameHere.setOnClickListener{bitmap?.let{it1->compressBitmap(it1)}}”,没有质量参数,因为我发现它可以在compress函数中轻松设置。无论如何,感谢您的提示Waseem!
        if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK
            && data != null && data.getData() != null) {
    
                mImageUri = data.getData()!!
    
            image1.setImageURI(data.getData())
    
    
       }
    }