Kotlin Реализация сжатия изображения - PullRequest
3 голосов
/ 14 июля 2020

Моя старая реализация для загрузки изображения в хранилище Firebase в формате JPEG без какого-либо сжатия

private fun sendToFirebase() {

        if (imgUri != null) {

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

            // code to upload and read image url
        }
    }

Решил написать метод сжатия изображения для сжатия изображения и последующей загрузки в хранилище Firebase

Результат: Достигнутый метод сжатия изображения, см. Ниже

Новый добавленный код для сжатия изображения

  1. URI для Bitmap

    val bitmap = MediaStore.Images.Media.getBitmap(activity?.contentResolver, imgUri)
    
  2. Метод сжатия растрового изображения

     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. Реализация сжатия растрового изображения

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

    }
}

1 Ответ

3 голосов
/ 16 июля 2020

Кажется, вы ничего не передаете в свою функцию для 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: 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 на текущей странице для отображения выбранного изображения.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...