Android Kotlin图像压缩的实现
我以前的实现是以JPEG格式将图像上载到Firebase存储,无需任何压缩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
private fun sendToFirebase() {
if (imgUri != null) {
val fileRef = storageRef!!.child(username+ ".jpg")
....
// code to upload and read image url
}
}
决定编写一种图像压缩技术来压缩图像,然后上传到Firebase存储
结果:实现了图像压缩技术,如下所示
新添加的压缩图像的代码
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)
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())
}
}