Bitmap占用内存大小 = 长 * 宽 * 一个像素点占用的字节数,因此降低任意一个参数的值,就可以达到压缩的目的。
1、质量压缩 - 降低图片文件的大小,但是不改变内存大小
质量压缩不会减少图片的像素,它是在保持像素的前提下改变图片的位深及透明度,图片的长,宽,像素都不会改变,因此bitmap所占内存大小也不会变。
fun compressByQuality(srcPath: String?, targetPath: String?, quality: Int): Boolean {
var outputStream: OutputStream? = null
return try {
// 检测源文件是否存在
val srcBitmap = BitmapFactory.decodeFile(srcPath)
if (srcBitmap == null) {
Log.v("BitmapUtils.compress", "gen bitmap err:$srcPath")
return false
}
outputStream = FileOutputStream(targetPath)
srcBitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream)
} catch (e: Exception) {
Log.v("BitmapUtils.compress", "err:$e")
false
} finally {
try {
outputStream?.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
}
2、采样率压缩 - 改变宽高
采样率,例如SampleSize,则常宽高都为原来的1/2,由于宽高减少了,图片的大小也会降低,同时占用内存也会降低。
fun compressBySampleSize(srcPath: String?, targetPath: String?, inSampleSize: Int): Boolean {
var outputStream: OutputStream? = null
return try {
// 检测源文件是否存在
val option = BitmapFactory.Options()
option.inSampleSize = inSampleSize
val srcBitmap = BitmapFactory.decodeFile(srcPath, option)
if (srcBitmap == null) {
Log.v("BitmapUtils.compress", "gen bitmap err:$srcPath")
return false
}
outputStream = FileOutputStream(targetPath)
srcBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
} catch (e: Exception) {
Log.v("BitmapUtils.compress", "err:$e")
false
} finally {
try {
outputStream?.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
}
3、改变像素大小
使用Bitmap.Config.RGB_565,单个像素占用的字节少了,内存使用率会下降。
fun compressByPreferredConfig(srcPath: String?): Bitmap? {
return try {
// 检测源文件是否存在
val option = BitmapFactory.Options()
option.inPreferredConfig = Bitmap.Config.RGB_565;
val srcBitmap = BitmapFactory.decodeFile(srcPath, option)
if (srcBitmap == null) {
Log.v("BitmapUtils.compress", "gen bitmap err:$srcPath")
return null
}
return srcBitmap
} catch (e: Exception) {
Log.v("BitmapUtils.compress", "err:$e")
null
}
}
网友评论