Search code examples
kotlinimage-compression

Trying to use Zelory compressor in fragment with Kotlin


I am trying to implement image compression for my file upload to Firebase Storage. Normal image choosing and upload works perfectly, but i would now like to implement image compression. I came across Zelory compressor and i am trying to implement but i can't seem to use the code correctly.

I am using this within a fragment and when i am trying to load the bitmap into the compressor line its seems to be giving an error on context:

error on code

My code before this is taking the ImageUri and converts it to a file path as needed by compressor.

val image_file_path = File(mImageUri.path)
val ctx = activity!!.applicationContext

val tempBitmap = Compressor.compress(ctx, image_file_path)

mImageUri is what i was using when just choosing and uploading as normal to firebase.

I have had a look at many examples of people trying to use this code and i can't to see what i am doing wrong. is it something to do with the fact that i am using it in a fragment? If so i would not mind changing my layout to just upload in the normal layout rather than a fragment.

I initially had the ctx input as just activity thinking that was the problem but this doesnt take away the error. any help?


Solution

  • I resolved this by not using the Zelory Tool. It is complicated and found a more "standard" library to achieve the same.

    The way to achieve the compression is to take your image, convert to Bitmap and follow the instructions in this link I found:

    https://android--code.blogspot.com/2018/04/android-kotlin-compress-bitmap-example.html

    It's honestly self explanatory, and the only difference i had to the code was that they use a static drawable whereas i had to convert my URI to Bitmap. i did this by using the following line:

    val bitmap = MediaStore.Images.Media.getBitmap(activity?.contentResolver,mImageUri)
    

    In the above, I use activity? because I was performing this operation in a fragment. Also, mImageUri is a companion object to which I assign the URI after selecting from the phones gallery.

    The rest is as per the link.

    Good luck to anyone else trying this. to give you a sense of the compression. going this route, I was able to compress a 8MB photo to 350kb using WEBP. Very efficient!

    PS: When using WEBP, I managed to apply a 1% quality as per the above compression stated without much loss of quality. Even when downloading the compressed image on a PC, you would not say it was compressed.