我以前的实现是在没有任何压缩的情况下,以JPEG格式将图像上传到Firebase存储
private fun sendToFirebase() {
if (imgUri != null) {
val fileRef = storageRef!!.child(username+ ".jpg")
....
// code to upload and read image url
}
}决定写一种图像压缩技术来压缩图像,然后上传到Firebase存储
结果:已实现图像压缩技术,见下文
新增加的压缩图像代码
val位图= MediaStore.Images.Media.getBitmap(activity?.contentResolver,imgUri)
压缩位图的
私有乐趣compressBitmap(位图:位图,质量:Int):位图{ val流= ByteArrayOutputStream() bitmap.compress(Bitmap.CompressFormat.WEBP,quality,stream) val byteArray = stream.toByteArray()返回BitmapFactory.decodeByteArray(byteArray,0,byteArray.size) }
compressBitmap(位图,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
.....
}
}发布于 2020-07-16 07:48:43
您似乎没有将任何东西传递到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是对防火墙上传的调用。我正在将压缩的位图传递到函数中。上传功能如下:
在下面,mImageURI是一个配套的对象,它是为压缩而传递的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:意图?){ 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())
}
}在上面的image1中,是当前页面上显示所选图像的imageView。
希望这能有所帮助
https://stackoverflow.com/questions/62898708
复制相似问题