Bitmap压缩

2023-01-10  本文已影响0人  NIIIICO

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
    }
}
上一篇下一篇

猜你喜欢

热点阅读