suvodipMondal
suvodipMondal

Reputation: 878

Android bitmap compress method is returning same size image even on different quality value

I am trying to scale and then compress an image file as PNG, the camera image format is in JPG and it is being scaled successfully and but it is still not being converted to PNG. Secondly I think compress method returns different sized byteArray for different quality but I am getting same sizes even on changing the quality parameter value.

Here is the method I have written:

   fun compressImage(file: File): File {
        val outputBounds = 600
        val scaleOptions = BitmapFactory.Options()
        scaleOptions.inJustDecodeBounds = true
        BitmapFactory.decodeFile(file.path, scaleOptions)

        val scaleFactor =   if(scaleOptions.outHeight > outputBounds || scaleOptions.outWidth > outputBounds)
                                        kotlin.math.max(scaleOptions.outWidth/outputBounds, scaleOptions.outHeight/outputBounds)
                                    else 1

        val outOptions = BitmapFactory.Options()
        outOptions.inSampleSize = scaleFactor.roundToInt()
        outOptions.inPreferredConfig = Config.RGB_565;
        outOptions.inDither = true;
        val decodedBMP = BitmapFactory.decodeFile(file.path, outOptions)

        var byteOutStream = ByteArrayOutputStream()
        val newFile = File(file.path)
        val fileOutputStream = FileOutputStream(newFile, false)
        var quality = 60
        decodedBMP.compress(Bitmap.CompressFormat.PNG, quality, byteOutStream)

        fileOutputStream.write(byteOutStream.toByteArray())
        fileOutputStream.flush()

        fileOutputStream.close()
        return newFile
    }

I passed a file as parameter here and I am overwriting the file with the compressed image.

Update

I tried using Bitmap.CompressFormat.JPEG as bitmap compression config and that is compressing the image size but with apparently losing quality (I mean picture looks like pixelated), I read Bitmap.CompressFormat.PNG gives you lossless compression but it is not working.

Upvotes: 0

Views: 1175

Answers (1)

i_o
i_o

Reputation: 789

In the Android Developer reference docs it says:

JPEG Added in API level 1 public static final Bitmap.CompressFormat JPEG Compress to the JPEG format. quality of 0 means compress for the smallest size. 100 means compress for max visual quality.

PNG Added in API level 1 public static final Bitmap.CompressFormat PNG Compress to the PNG format. PNG is lossless, so quality is ignored.

Here is the answer. Since quality is ignored Compress to format.PNG is lossless, which means it will not compress.

Upvotes: 1

Related Questions