Bitmap压缩

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
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容