沃梦达 / IT编程 / 移动开发 / 正文

Android 基于Bitmap的四种图片压缩方式

本文中探究的图片压缩方式主要是基于 Bitmap 的 api 实现。文中探究实现的压缩方式有四种:质量压缩、采样率压缩、Matrix 缩放压缩、图片编码格式压缩,感兴趣的朋友可以参考下

结果真的是对输出流的字节数有影响

2、采样率压缩

BitmapFactory.Options 中有个属性 inSampleSize,系统中采样率压缩就是通过该属性


/**
* 如果设置为大于1的值,则请求解码器对原始图像进行二次采样,返回较小的图像以节省内存。
* 样本大小是任一维度中与解码后的位图中的单个像素相对应的像素数。 例如,inSampleSize == 4
* 返回的图像为原始宽度/高度的1/4,像素数目的1/16。 任何小于等于1的值都与1相同。
* 注意:解码器使用基于2的幂的最终值,任何其他值将四舍五入为最接近的2的幂。
**/
 public int inSampleSize;

直接上代码


    /**
     * 根据设定的宽高计算缩放比
     */
    fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {
        val height = options.outHeight
        val width = options.outWidth
        var inSampleSize = 1
        if (height > reqHeight || width > reqWidth) {
            val heightRatio = round(height.toFloat() / reqHeight.toFloat()).toInt()
            val widthRatio = round(width.toFloat() / reqWidth.toFloat()).toInt()
            inSampleSize = if (heightRatio < widthRatio) heightRatio else widthRatio
        }
        return inSampleSize
    }

    /**
     * 获取缩放后的图片
     */
    fun getSmallBitmap(filePath: String,reqWidth: Int,reqHeight: Int): Bitmap {
        val options = BitmapFactory.Options()
        options.inJustDecodeBounds = true //不加载 bitmap 进内存,只获取他的基本信息
        BitmapFactory.decodeFile(filePath, options)
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight)
        options.inJustDecodeBounds = false
        return BitmapFactory.decodeFile(filePath, options)
    }

结果

3、缩放法压缩

这种方法主要是依赖 Matrix 矩阵变换的方式对图片进行处理。Matrix 中有很多对图片变换的 api 这里只使用它的缩放功能,其他功能可以自行了解

代码


    /**
     * 通过矩阵缩放
     */
    fun matrixBitmap(bitmap: Bitmap,scale:Float):Bitmap{
        val matrix = Matrix()
        matrix.setScale(scale,scale)
        var bm = Bitmap.createBitmap(bitmap,0,0,bitmap.width,bitmap.height,matrix,true)
        return bm
    }

当设置缩放比为0.5时,图片整体就缩放为原来的1/4

4、RGB_565 通过改变图片格式来实现压缩

系统默认使用的是ARGB_8888的格式,所以我们只要改变这个 options 值就能实现


fun rgb565Bitmap(filePath: String):Bitmap{
        val options = BitmapFactory.Options()
        options.inPreferredConfig = Bitmap.Config.RGB_565
        var bitmap = BitmapFactory.decodeFile(filePath,options)
        return bitmap
}

结果图片变成了原图的一半

总结

对于图片的压缩,首先可以先将图片格式改为 RGB_565,这样图片先减小一半,然后对于图片的显示可以使用采样率压缩或者缩放压缩的方式将图片的分辨率改为我们显示的大小,如果是要将图片上传服务器那么可以使用质量压缩的方式,但是这种方式不支持 png 格式的图片。

以上就是Android 基于Bitmap的四种图片压缩方式的详细内容,更多关于Android Bitmap图片压缩的资料请关注编程学习网其它相关文章!

本文标题为:Android 基于Bitmap的四种图片压缩方式