Bitmap内存占用与Config关系笔记
关于内存占用
Q:请问Bitmap的内存占用如何计算?
A:int momery = higthPixel * widthPixel * config因子;
什么是config因子?接着看。
Config因子
1 | enum Bitmap.Config { |
- ALPHA_8(基本不用):每个像素使用一个独立的alpha通道存储,该通道占用8bit,即:每个像素占用
1byte = 8bit / 8
内存,如果bitmap使用这种config编码,以上config因子为1;注意:此属性会导致RGB通道信息丢失,只剩下透明度,所以基本不会用到 - RGB_565:只编码RGB通道信息,没有透明alpha通道信息,Red红色通道信息占用5位内存,Green绿色通道信息占用6位内存,Blue蓝色通道信息占用5位内存。每个像素占用
2 byte= (5bit + 6bit + 5bit) / 8
内存,支持2^16 = 65535种颜色。质量较好,此时config因子为2; - ARGB_8888:每个通道(Alpha+RGB)都各占用8位内存,支持2^32 = 1600w种颜色,质量最好,每个像素占用
4 byte = 8bit * 4 / 8
内存,此时config因子为4。
RGB_565比ARGB_8888节省内存相信很多同学都知道,但是为什么RGB_565更节省内存?Bitmap每个像素的内存占用是怎么来的?
希望本文能解决一些同学的疑惑。因为RGB_565牺牲了alpha通道,不支持透明度,并且RGB每个通道信息较ARGB_888更少。
不同Config加载效果图
原颜色值:#9966AAFF
使用ALPHA_8加载丢失了RGB信息
使用RGB_565加载丢失了alpha通道透明度
使用ARGB_8888可正常加载
本文作者MichaelX,个人博客:http://blog.michaelx.tech 本文遵从CC协议,转载请注明出处。
结论
当加载一张1080 * 1920px的图片时,使用以上config加载的内存占用情况分别为:
- ALPHA_8(基本不用):1080 * 1920 byte = 2025Kb = 2Mb
- RGB_565:1080 * 1920 * 2 byte = 4050Kb = 4Mb
- ARGB_8888:1080 * 1920 * 4 byte = 8100Kb = 8Mb
可以酌情选择合适的config进行加载,但是最好全局只使用一个config,否则易导致个别图片信息丢失或者加载错误。