Compress Image Size (without reducing the quality) In Kotlin
we will call like below :
compressImage(filePath, 0.5)
/ /file path means path of the file and 0.5 means target size of the image in MB
//in the below function we will image in file format
fun compressImage(filePath: String, targetMB: Double = 1.0) : File {
var file = File(filePath)
var fullSizeBitmap: Bitmap = BitmapFactory.decodeFile(filePath)
var exif = ExifInterface(filePath)
val exifOrientation: Int = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL
)
val exifDegree: Int = exifOrientationToDegrees(exifOrientation)
fullSizeBitmap = rotateImage(fullSizeBitmap, exifDegree.toFloat())
try {
val fileSizeInMB = getFileSizeInMB(filePath)
Log.d("TAG", "before compressImage: $fileSizeInMB")
var quality = 100
if(fileSizeInMB > targetMB){//1.0 means target MB
quality = ((targetMB/fileSizeInMB)*100).toInt()
}
val fileOutputStream = FileOutputStream(filePath)
fullSizeBitmap.compress(Bitmap.CompressFormat.JPEG, quality, fileOutputStream)
fileOutputStream.close()
Log.d("TAG", "after compressImage: ${getFileSizeInMB(filePath)}")
file = File(filePath)
}catch (e: Exception){
e.printStackTrace()
}
return file
}
//here we get file size
fun getFileSizeInMB(filePath: String): Double{
val file = File(filePath)
val length = file.length()
val fileSizeInKB = (length/1024).toString().toDouble()
return (fileSizeInKB/1024).toString().toDouble()
}
//here we get rotation of the image
fun exifOrientationToDegrees(exifOrientation: Int): Int {
return when(exifOrientation){
ExifInterface.ORIENTATION_ROTATE_90 -> 90
ExifInterface.ORIENTATION_ROTATE_180 -> 180
ExifInterface.ORIENTATION_ROTATE_270 -> 270
else -> 0
}
}
//here we change the rotation of the captured image
fun rotateImage(fullSizeBitmap: Bitmap, angle: Float): Bitmap {
val matrix = Matrix()
matrix.postRotate(angle)
return Bitmap.createBitmap(fullSizeBitmap, 0, 0, fullSizeBitmap.width, fullSizeBitmap.height, matrix, true)
}
