Home Bitmap简介
Post
Cancel

Bitmap简介

简介

bitmap翻译为位图,指的是一张图片。是安卓中常用于操作图像的一个类,提供图片加载、裁剪、旋转等诸多操作。

创建

Bitmap提供多种构建方式

Bitmap.createBitmap()的一系列重载

BitmapFactory的一系列方法

加载图片

可以使用BitmapFactory来从文件系统、资源、输入流以及字节数组中加载出一个bitmap对象。 因为Bitmap占用空间比较大,尤其是加载大图时,而往往并不需要那么清晰的图片时,还全量加载的话会照成资源的浪费,并且更严重会导致OOM的发生。 BitmapFactory提供一个Options来优化加载图片,Options可以设置采样率,通过设置inSampleSize参数来控制。当inSampleSize=2时,表示长宽都为原始尺寸的一半,总大小就为原来的1/4了。 inSampleSize会向下取整为2的指数。

1
2
val options = BitmapFactory.Options()
options.inSampleSize = 2

而往往我们并不知道图片的尺寸大小。这时可以通过设置inJustDecodeBounds来解析图片大小。

1
2
3
4
5
6
7
val options = BitmapFactory.Options()
// 只测量宽高不加载到内存
options.inJustDecodeBounds = true
BitmapFactory.decodeResource(resources, R.drawable.img, options)
// 获取测量的宽高
val height = options.outHeight
val width = options.outWidth

还可以通过设置加载的格式来进一步优化空间,默认图片为Bitmap.Config.ARGB_8888,占4个字节。若不关心透明度,可以使用Bitmap.Config.RGB_565。这种模式图片质量几乎没有差别但只占用2个字节,可以使图片所占内存减小到之前的一半。(ARGB_4444)因为质量较差已被废弃。

1
2
val options = BitmapFactory.Options()
options.inPreferredConfig = Bitmap.Config.RGB_565

图片所占内存 = 长 x 宽 x 单像素空间

Drawable 缩放规则

系统首先会去加载对应dpi的图片,当没有时会向上查找。当dpi不匹配时,会进行一定程度的缩放。例如(宽度举例):

当使用460dpi的手机去加载一个250像素的图片,图片位于xxxhdpi下即640dpi。这时实际图片大小就为460/640*250=179.68会向下取整为179。当然如果我们手动更改系统的densityDpi,这里的图片也会受到相应的影响。

参考

This post is licensed under CC BY 4.0 by the author.