ARGB_8888-ALPHA_8-ARGB_4444-RGB_565的区别

序言

作为Android开发程序猿,OOM的异常相比都遇到过吧,对内存及性能的优化,一直以来都是一个很头疼的问题。Bitmap就是其中的一大杀手,一般使用都是需要经过压缩或者取缩略图的,可能会影响其尺寸大小,然而除了尺寸大小,我们还应该关注一下其色彩相关的细节。

Bitmap.Config

在Bitmap类中,有一个内部类Config,是枚举类型,在构造Bitmap的时候会最为参数使用到:createBitmap(int width, int height, Bitmap.Config config),这里面有什么需要注意的地方呢?

就是下面这几个枚举值:

ALPHA_8

  • 每个像素存储一个单一的透明度(alpha)通道
  • 没有颜色信息存储(没有RGB通道)
  • 每像素占用1字节(8位)

GRB_565

  • 每像素存储2个字节(16位),只有RGB通道
    • R-红色存储5位的精度
    • G-绿色存储6位的精度
    • B-蓝色存储5位的精度
  • 此配置可以用在使用不透明的位图,不需要色彩保真度高的地方

ARGB_4444

  • 每像素存储2个字节(16位)
  • R、G、B颜色通道和透明(alpha)通道,每个通道占用4位
  • 有alpha通道的图片可以使用该属性
  • 已废弃,因为该属性下图片质量差
  • 在SDK版本为KITKAT,使用这个属性创建bitmap默认会被ARGB_8888代替

ARGB_8888

  • 每像素存储4个字节(32位)
  • RGB和alpha通道存储8位的精度
  • 这个属性很灵活,创建的高质量的bitmap,建议使用

总结

最后,我们来计算一下bitmap的大小:

  • bitmap大小 = 像素数 每个像素的内存大小 = bitmap的长 bitmap的宽 * 每像素占用内存位数

  • 计算一张480 * 800的bitmap的大小(以ARGB_8888为例):

    480 800 4(ARGB_8888每像素占用字节) = 1 536 000 byte => 1 536 000 / 1024 = 1500 kb(1.5M)

这样我们就可以精确计算bitmap的大小了,是不是说ARGB_8888占用内存比较大,就不去使用了呢?并不是这样的,分析如下:

  • ALPHA_8 只有alpha通道,使用场景单一,不推荐
  • ARGB_4444 已经废弃,且创建的位图质量差,不推荐
  • ARGB_565 能够在保证图片质量的情况下减少内存开销,唯一缺点就是没有alpha通道
  • ARGB_8888 能够创建高质量的图片,但是内存开销比较大

所以,并没有哪个属性更好,只有更合适,依据场景和需求使用不同的属性

谢谢大爷~

  • 微信打赏二维码

    微信

  • 支付宝打赏二维码

    支付宝



目录
  1. 1. 序言
  2. 2. Bitmap.Config
    1. 2.1. ALPHA_8
    2. 2.2. GRB_565
    3. 2.3. ARGB_4444
    4. 2.4. ARGB_8888
  3. 3. 总结
本站访问量   |   您是第 位.