一、引言
- Drawable:通用的图形对象,用于装载常用格式的图像,既可以是PNG,JPG这样的图像, 也是前面学的那13种Drawable类型的可视化对象!我们可以理解成一个用来放画的——画框!
- Bitmap(位图):我们可以把他看作一个画架,我们先把画放到上面,然后我们可以 进行一些处理,比如获取图像文件信息,做旋转切割,放大缩小等操作!
- Canvas(画布):如其名,画布,我们可以在上面作画(绘制),你既可以用Paint(画笔), 来画各种形状或者写字,又可以用Path(路径)来绘制多个点,然后连接成各种图形!
- Matrix(矩阵):用于图形特效处理的,颜色矩阵(ColorMatrix),还有使用Matrix进行图像的 平移,缩放,旋转,倾斜等!
在Android中我们使用图像经常涉及到Bitmap,而Bitmap使用不当容易引发Out Of Memory(内存溢出),接下来我们就来谈及如何优化处理Bitmap,防止引发内存溢出问题
先来了解下Bitmap占用内存大小的计算公式为:图片宽度×图片高度×一个像素点所占字节数 ,所以减小这三个参数的任一值都可减小bitmap所占的内存大小
也可以通过调用Bitmap.getAllocationByteCount() 方法来查看Bitmap所占内存大小
二、减小内存占用
1.BitmapFactory.Options.inSampleSize
inSampleSize 是BitmapFactory.Options的一个属性,改变该配置即改变图片的宽高,如果设置为大于1的值(小于1的值即为1),则请求解码器对原始图像进行二次采样,返回较小的图像以节省内存。
例如,inSampleSize = 4返回的图像为原始宽度/高度的1/4,像素数目的1/16。
该属性配合inJustDecodeBounds属性使用,如果设置为true,则解码器将返回null(无位图),但out...
仍将设置字段,从而允许调用者查询位图而不必为其像素分配内存。
private fun sampleCompress(requestWidth: Int, requestHeight: Int) {
val options = BitmapFactory.Options()
// 不分配内存空间,仅计算图片尺寸
options.inJustDecodeBounds = true
BitmapFactory.decodeResource(resources, R.mipmap.timg, options)
Log.d(TAG, "bitmap