- 什么是Bitmap
- 1.Bitmap.Config类
- 2.位深和色深
- 3.常见的压缩格式
- 4.Bitmap的简单使用
- 4.1 Bitmap的创建方法
- 4.2 通过**BitmapFactory**工厂类
- 4.3 Bitmap的压缩存储方法
- 4.3 BitmapFactory.Option类
Bitmap也就是位图,它本质上就是一张图片的内容在内存中的表达形式。它将图片的内容看作是由存储数据的有限个像素点组成的,每个像素点存储该位置的ARGB值,当每个像素点的ARGB值确定下来的时候,图片的内容也就确定了。
ARGB:其中A代表透明度,RGB代表红绿蓝三种颜色通道值,每个通道的取值范围在0–255之间,也即是有256个值,正好可以通过一个字节(8bit)进行表示。所以每个通道值由一个字节表示,四个字节表示一个像素信息。
Bitmap.Config是Bitmap中的一个enum类
通过官方文档可以知道,它表示的就是每个像素点对ARGB通道值的存储方式。
主要的存储方式有以下四种:
2.位深和色深
- ARGB_8888:每个通道值都采用一个字节来表示,每个像素点需要用四个字节来表示,图片的质量是最高的,但是占用内存也是最多的
- ARGB_4444:和上面类似,每个通道值都是四位,每个像素点用两个字节表示,图片失真比较严重,所以一般不采用
- RGB_565:不支持透明度,RGB分别占用5,6,5位;每个像素点占用两个字节,,是ARGB_8888方案的一半
- ALPHA_8:不支持颜色值,只支持透明度,使用场景比较特殊,比如设置覆盖效果等
通常我们会在ARGB_8888和RGB_565之间进行选择。
图片在内存和磁盘中的两种表现形式分别为bitmap和各种压缩格式
(1)色深:色深指的是每一个像素点用多少bit来存储ARGB值,属于图片自身的一种属性。
色深可以用来衡量一张图片的色彩处理能力(丰富程度)。
Bitmap.Config参数的值指的就是色深。比如ARGB_8888的色深为32位。
(2)位深:位深指的是在对Bitmap进行压缩时存储每个像素点所用的bit数,主要用于存储;
由于是压缩存储,所以位深值一般小于或者等于色深值。
假如说一张图片是100 * 100像素,色深32位(ARGB_8888),保存时位深是24位,
该图片在内存中所占的大小:100 * 100 *(32/8)个byte
在文件中所占用的大小 :100 * 100 (32/8)(24/32)个byte。
Bitmap的压缩格式就是最终持久化存储得到的图片样式,一般通过图片的后缀名就可以知道通过什么方式进行的压缩。
4.Bitmap的简单使用 4.1 Bitmap的创建方法
- Gif :Gif是一种无损压缩格式,压缩率一般在50%,Gif可以插入多帧,从而实现动画效果,因此Gif也分为静态和动态两种
- BMP:BMP是标准图形格式,它是包括Windows在内的多种操作系统图像展现的形式,其本质就是bitmap对象直接持久化保存的文件格式,因为没有进行压缩,所以图片尺寸非常大。
- PNG:PNG也属于无损压缩,位深位32位。
- JPREG:JPEG是一种有损压缩格式,采用24位存储RGB通道值,也就是说JPEG不支持透明度
- WEBP:Webp是Google在2010年发布的一种新的图片格式,支持有损压缩和无损压缩,支持完整的透明通道,也支持多帧动画,基本取代了gif。
在Bitmap类中,构造方法是默认权限,并且Bitmap这个类也是final的,所以我们并不能通过new来创建bitmap对象。
所以我们需要通过Bitmap类的静态方法来创建。
其中呢大致分为三类
(1)根据已有的bitmap对象来创建新的bitmap对象
public static Bitmap createBitmap( Bitmap source, int x, int y, int width, int height,
Matrix m, boolean filter){
}
( 2) 通过像素点数据进行创建
**
* 返回一个具有指定宽度和高度的不可变位图,每个像素值设置位color数组中的对应值
* @param display
* @param colors 像素点数组
* @param offset 颜色数组中第一个值的位置
* @param stride 行之间数组中的颜色数(需>=width 或者 <= -width)
* @param width 宽度
* @param height 高度
* @param config 要创建的bitmap的配置(如果不支持A通道,数组中的alpha值将无效)
* @return
*/
public static Bitmap createBitmap(DisplayMetrics display,
@ColorInt int[] colors, int offset, int stride,
int width, int height,Bitmap.Config config){}
( 3)通过对原位图进行缩放
public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height)
4.2 通过BitmapFactory工厂类
BitmapFactory是Bitmap的工具类,通过各种数据源来创建bitmap对象。
- decodeFile:从本地图片文件中加载bitmap对象
- decodeResource:从项目资源文件中加载bitmap对象
- decodeStream:从流对象(网络输入流或者本地文件输入流)加载bitmap对象
- decodeByteArray:从字节数组中加载
其中decodeFile和decodeResource最终都会通过decodeStream方法来解析加载Bitmap对象。
Bitmap的压缩存储和加载正好是相反的过程,通过compress方法进行实现。
public boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream)
4.3 BitmapFactory.Option类
BitmapFactory.Option代表对Bitmap对象的属性设置。
一般情况下,调用decodexxx方法时我们不需要传递这个属性值,此时是通过默认的配置信息来创建bitmap对象;
如果我们需要自定义Bitmap的属性就需要传递option对象(通过Option的构造方法进行创建)
常见的配置信息:
| 属性 | 作用 |
|---|---|
| boolean inJustDecodeBounds | 如果这个值为true,在解码时不会返回bitmap对象,只会返回bitmap的尺寸 |
| int outWidth和outHeight | 表示这个Bitmap的宽和高,一般和inJustDecodeBounds一起使用 |
| int inSampleSize | 压缩图片时采样率的值,如果这个值大于1,按照(1/samplesize)来缩小bitmap的宽高 |
| int inDensity | 像素密度,对应的是 DisplayMetrics 中的 densityDpi |
| boolean inDither | 防抖动,默认为false |
| boolean inScaled | 是否可以缩放,默认true |
| boolean isMutable | 该属性表示通过decodexxx方法创建的bitmap对象代表的图片是否允许被外部更改,比如利用canvas重新绘制等,默认为false,也就是不可以被修改 |
| inPreferredConfig | 设置色彩模式,默认采用ARGB_8888 |



