簡體   English   中英

Kotlin 圖像壓縮實現

[英]Kotlin Image Compression Implementation

我的舊實現將圖像上傳到 Firebase 以 JPEG 格式存儲而不進行任何壓縮

private fun sendToFirebase() {

        if (imgUri != null) {

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

            // code to upload and read image url
        }
    }

決定寫一個圖片壓縮技術來壓縮圖片然后上傳到Firebase存儲

結果:實現了圖像壓縮技術,見下文

新增壓縮圖片的代碼

  1. Bitmap 的 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. Bitmap壓縮實現

     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
        .....

    }
}

您似乎沒有將任何東西傳遞給您的 function 的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 上傳的調用。 我將壓縮的 bitmap 傳遞到 function 中。 上傳功能如下:

下面的mImageURI是一個伴隨的 object,它是傳遞給壓縮的 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())


   }
}

上圖中 1 是當前頁面上的 imageView 以顯示所選圖像。

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM