一、简介
Bitmap,即位图。它本质上就是一张图片的内容在内存中的表达形式。
Bitmap是Android系统中的图像处理中最重要类之一。Bitmap可以获取图像文件信息,对图像进行剪切、旋转、缩放,压缩等操作,并可以以指定格式保存图像文件。
Bitmap的主要使用:
- 给ImageView设置背景
- 当做画布来使用
imageView.setImageBitmap(Bitmap bm); //给ImageView设置背景
Canvas canvas = new Canvas(Bitmap bm); //当做画布来使用
二、Bitmap 压缩
Bitmap的存储格式
Bitmap有四种存储方式,对应Bitmap.Config中的四个常量
- ALPHA_8:只存储透明度,不存储色值,1个像素点占1个字节
- ARGB_4444:ARGB各用4位存储,1个像素点16位占2个字节
- ARGB_8888:ARGB各用8位存储,1个像素点32位占4个字节
- RGB_565:只存储色值,不存储透明度,默认不透明,RGB分别占5,6,5位,一个像素点占用16位2个字节。
一般情况下,我们不会使用ALPHA_8,他只存储透明度,没啥用处。对于ARGB_4444,它的画质又太感人了,ARGB_8888画质高但是占内存,RGB_565还行,就是不可以设置透明度。
BitmapFactory默认色彩度为 ARGB_8888
使用时注意以下三点即可:
- 一般情况下用ARGB_8888格式存储Bitmap
- ARGB_4444画面惨不忍睹,被弃用
- 假如对图片没有透明度要求,可以使用RGB_565,比ARGB_8888节省一半的内存开销
public static Bitmap drawableToBitmap(Drawable drawable) {
// 取 drawable 的长宽
int w = drawable.getIntrinsicWidth();
int h = drawable.getIntrinsicHeight();
// 取 drawable 的颜色格式
Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565;
// 建立对应 bitmap
Bitmap bitmap = Bitmap.createBitmap(w, h, config);
// 建立对应 bitmap 的画布
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, w, h);
// 把 drawable 内容画到画布中
drawable.draw(canvas);
return bitmap;
}
压缩格式
如果一张和手机屏幕大小一样的Bitmap图片,采用ARGB_8888格式存储需要24MB。(按照1024*768的屏幕大小来计算,每个像素需要32位也就是4个字节,result = 1024*768*32B=25165824B=24MB)
压缩图片的格式使用枚举类Bitmap.CompressFormat中,有以下三种
- Bitmap.CompressFormat.JPEG:采用JPEG压缩算法,是一种有损压缩格式,会在压缩过