Android刷题日记1-关于图片加载占用多少内存

208 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、题目描述:

有一张尺寸为 72*72 像素的图片,其采用 ARGB8888 格式存储,现将其置于某应用的 drawable-xxhdpi 目录中,在屏幕密度为 xhdpi 的手机上运行此应用。 问:此图片不经过采样直接加载后将占用多少 byte 内存()

  •   20736
    
  •   5184
    
  •   9216
    
  •   2304
    

二、思路分析:

1、每个像素占用多少 byte ?

Bitmap.Config 有四种枚举类型。
通道类型后数字表示每个通道占的大小

  • ARGB_8888:每个通道 8 bit * 4个通道 = 32 bit = 4 byte,即每个像素点占用4字节
  • ARGB_4444:同理,2 字节
  • RGB_565:RGB 3个通道分别是 5 、6 、5 ,加起来 16 bit,也就是 2 个 byte
  • ALPHA_8:只有 A 通道,占 8 bit,1 个byte

2、被加载的图片有多少像素点呢?

各资源文件对应屏幕密度(每英寸的像素点)

注意:实际加载的像素不一定等于原图像素,如资源目录屏幕密度与目标机器不匹配,将按比例缩放。这点将在文章最后解释。

3、总结,此类问题公式如下:

类型占用比特 x 图片原像素宽 x(目标机器屏幕密度/资源文件夹代表屏幕密度)x 图片原像素高 x(目标机器屏幕密度/资源文件夹代表屏幕密度)
4 * 72 * (320/480) * 72 * (320/480)= 9216 byte

这也是为什么在开发中往往尽可能配齐多个资源文件夹,在高分别率的机器上使用低分辨率资源文件夹的资源有可能导致占用内存翻倍,甚至翻数倍

四、注意点:

注意:实际加载的像素不一定等于原图像素,如资源目录屏幕密度与目标机器不匹配,将按比例缩放

首先解释一下图片为什么会被缩放,当我们使用资源id来去引用一张图片时,Android会使用一些规则来去帮我们匹配最适合的图片。什么叫最适合的图片?比如手机屏幕密度是xhdpi,那么drawable-xhdpi文件夹下的图片就是最适合的图片。因此,当我引用android_logo这张图时,如果drawable-xhdpi文件夹下有这张图就会优先被使用,在这种情况下,图片是不会被缩放的。但是,如果drawable-xhdpi文件夹下没有这张图时, 系统就会自动去其它文件夹下找这张图了,优先会去更高密度的文件夹下找这张图片,我们当前的场景就是drawable-xxhdpi文件夹。现在在drawable-xxhdpi文件夹下面找到android_logo这张图了,但是系统会认为你这张图是专门为高密度的设备所设计的,如果直接将这张图在当前的低密度设备上使用就有可能会出现像素过低的情况,于是系统自动帮我们做了这样一个缩小的操作,缩小比例就是320/480。