[英]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存儲
結果:實現了圖像壓縮技術,見下文
新增壓縮圖片的代碼
Bitmap 的 URI
val bitmap = MediaStore.Images.Media.getBitmap(activity?.contentResolver, imgUri)
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) }
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.