美文网首页
Bitmap压缩

Bitmap压缩

作者: NIIIICO | 来源:发表于2023-01-10 16:54 被阅读0次

    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
        }
    }
    

    相关文章

      网友评论

          本文标题:Bitmap压缩

          本文链接:https://www.haomeiwen.com/subject/tkptcdtx.html