初识Bitmap
Bitmap
- final类,不可继承
- 图形处理类
- 可获取图像信息
- 可对图像剪切、旋转、缩放、压缩
- 可保存为指定格式图像文件png、jpeg、webp
创建Bitmap
-
Bitmap#createBitmap()
-
BitmapFactory#decodeXxx()
Bitmap色彩模式 Bitmap.Config
表示每个像素点对ARGB通道值的存储方案
- ALPHA_8
- 每个像素存储一个透明通道,不存储颜色信息
- 每个像素占8位(1个字节),色深为8位
- 对于存储掩码比较有用
- RGB_565
- 每个像素占2个字节,只有RGB,其中R(5位)G(6位)B(5位)
- 可表示2^16种颜色,色深为16位
- 在不使用透明度时比较有用,常作为一种优化方案,减少内存占用
- ARGB_4444
- 每个像素占2个字节,由ARGB组成,每部分4位,共16位(2个字节)
- 可表示2^16种颜色,色深为16位
- 该配置图片质量很差,不清晰
- ARGB_8888
- 每个像素占4个字节,由ARGB组成,每部分8位,共32位(4个字节)
- 默认颜色配置,图片质量最好,最占空间,可表示2^24种颜色,色深为32位
- RGBA_F16
- 每个像素占8个字节
- 适用于宽色域和HDR内容
- HARDWARE
- 适用于位图只存储在图形内存上
- 该配置Bitmap不可变,不可作为canvas#drawBitmap参数
Bitmap内存信息API
// bitmap一行像素数
bitmap.width
// bitmap一列像素数
bitmap.height
// bitmap一行字节数,与颜色通道相关(Bitmap.Config.ARGB_8888...)
bitmap.rowBytes
// bitmap所占字节数=rowBytes*height
bitmap.byteCount
// 存储位图像素的已分配内存大小,默认与byteCount相同,重用或手动重新配置后会不同
bitmap.allocationByteCount
色深
Bitmap.Config参数值就是色深,可用来衡量一张图片的色彩处理能力(即色彩丰富度)
位深
记录数字图像颜色时,计算机实际是用每个像素需要的二进制数值位数来表示。是物理硬件参数,主要用来存储
例:某张图片像素200*300,色深32位(ARGB_8888),保存时位深24位,则:
内存占大小:200 * 300 * (32 / 8) Byte
文件占大小:200 * 300 * (24 / 8) * 压缩率 Byte
Bitmap压缩方式
CompressFormat
- JPEG:以JPEG压缩算法进行图像压缩,格式为jpg或jpeg,有损压缩
- PNG:以PNG压缩算法进行图像压缩,格式为png,无损压缩
- WEBP:以WEBP压缩算法进行图像压缩,格式为webp,有损压缩
- 质量相同情况下,webp比jpeg小40%
- webp编码时间比jpeg长8倍
Bitmap基本操作
裁剪
- Bitmap#createBitmap(bitmap, x, y, w, h)
从源bitmap中裁剪
x + w < bitmap.width && y + h < bitmap.height
- Bitmap#createBitmap(bitmap, x, y, w, h, matrix, filter)
矩阵可进行缩放、旋转、移动
filter为true表示bitmap会被过滤(仅当matrix包含移动+其他操作时适用)
缩放、旋转、移动、倾斜
- Bitmap#createBitmap(bitmap, x, y, w, h, matrix, filter)
倾斜Matrix#postSkew不可在创建bitmap时使用
val matrix = Matrix()
// 缩放
matrix.postScale(0.8f, 0.9f)
// 左旋转45°
matrix.postRotate(-45)
// 移动
matrix.postTranslate(100, 80)
val bitmap = Bitmap.createBitmap(src, 0, 0, src.width, src.height, matrix, true)
保存和释放
BitmapFactory#Options操作图像
- inBitmap:设置会将生成的图像内容加载至bitmap中
- inDensity:对bitmap设置密度,默认为true,若inDensity与inTargetDensity不匹配,bitmap返回前会将其缩放匹配inTargetDensity
- inTargetDensity:绘制目标bitmap上的密度
- inDither:是否做抖动处理,默认false
- inJustDecodeBounds:设为true表示获取bitmap信息,但不将其像素加载至内存
- inPreferredConfig:bitmap颜色配置信息,默认Bitmap.Config.ARGB_8888
- inSampleSize:压缩图像,值一般设为2的整数次幂,当设为2,宽高为原来1/2,图像大小为原来1/4
- inScaled:是否缩放
- outHeight:bitmap高度
- outWidth:bitmap宽度
优化
-
压缩
Bitmap优化 -
缓存
内存缓存LruCache
磁盘缓存DiskLruCache