Bitmap的内存占用

图片内存占用计算公式

图片分辨率 = a ,b  比如:18*12

图片存放的文件夹对应的dpi , 比如hdpi是240,xhdpi是320dpi ,我们定位为变量inDensity

手机设备的dpi,这个值取决于每台手机,
比如我的小米10pro,是440dpi (这个值并不是手机分辨率的平方之和 ,开根号,再除以手机尺寸,这个展示分辨率取决于厂商的算法), 
我们定义为targetDensity

图片缩放比例 scale= targetDensity / inDensity 

每个像素点的内存大小 pointMemory ,取决于色深,比如argb8888的色深就是32个bit位 = 4byte

图片占用内存 = (图片宽a * scale + 0.5) * (图片高 * scale +0.5) * pointMemory

同一张图片,展示在不同分辨率手机上,内存占用大小一致吗?

不一致。
因为inDensity的数值一致,但targetDensity的数值不一致,所以图片的缩放比例不同,占用内存自然不同

同一手机设备加载不同分辨率文件夹下的同一图片,内存占用大小一致吗?

一致。
虽然不同分辨率下的inDensity数值是不同的,但只要设计师是按照规范切的图,
那么不同分辨率图片之间的宽高缩放比例 = inDensity之间的比例。
所以最终不同分辨率的图片在同一设备上展示时,图片宽高缩放后得到的最终值是一致的,内存也就一致了。

imageView控件的大小会影响内存占用大小吗?

不会。
因为通过src属性,我们在获取对应的drawable时,设置的density为0,density为0的情况下,图片的宽高是不会进行任何的缩放的,故而占用内存大小也不会有任何的改变。
内存占用大小 = 图片原始宽 * 图片原始高 * 色深

同一个资源id,通过BitmapFactory创建的bitmap和xml文件中imageView设置的src,占用内存是否一致?

会有不一致的场景。
如果inDensity和targetDensity不一致,那么通过BitmapFactory创建的bitmap会进行缩放,
从而导致 内存大小 != 图片原始宽 * 图片原始高 * 色深。
而xml通过src属性设置的图片,因为density = 0的原因,图片不会进行任何的缩放
内存大小 = 图片原始宽 * 图片原始高 * 色深

三方图片加载框架设置图片大小,是否会影响图片占用内存?

会。
三方框架设置图片大小的操作本质,是修改图片的宽高,图片的宽高变了,占用内存大小自然也就变了

google图片适配的规则

先找手机设备dpi对应的drawable文件夹,如果当前文件夹找不到,google的策略是优先图片缩小。
所以会接着去找高分辨率下文件夹有没有这张图片,高分辨率都没有的情况下,会接着从低分辨文件夹中查找

比如:手机设备dpi 为320(xhdpi),如果在drawable-xhdpi文件中找不到对应图片,
则接着去drawable-xxhdpi、drawable-xxxhdpi文件夹中查找,
如果依然没有找到,则去drawable-hdpi、drawable-mdpi下查找

为什么建议图片要放在正确的分辨率文件夹下?

只针对手机设备的分辨率是xxhdpi做分析,其余分辨率自行思考,targetDensity = 480

分辨率是xxhdpi的图片,放在正确的drawable-xxhdpi文件夹下。
inDensity = 480,targetDensity = 480,图片缩放比例 scale = 1

分辨率是xxhdpi的图片,放在错误的drawable-xhdpi文件夹下。
inDensity = 320,targetDensity = 480,图片缩放比例 scale = 1.5

内存大小从  width * height * pointMemeory 变成了 (width * 1.5 + 0.5) * (height * 1.5 + 0.5) * pointMemory,
导致占用的内存增加了许多

一个dpi为320的手机设备,加载一张drawable-xxxhdpi下的图片,占用的内存和加载一张drawable-xhdpi下的图片一样吗?

当然一样,加载高分辨率图片时,图片是会缩小的,图片大小会缩放到和其他分辨率一致,故而占用内存大小是一致的

既然我们手机加载不同分辨率目录下的同一图片,占用内存大小都是一致的,那为什么还要创建多个drawable目录呢 ? 直接使用drawable-xxxhdpi,岂不是还可以缩小包体积?

这里涉及到一个问题,就是xml文件中我们使用imageView控件,直接通过src属性引用图片资源的场景.
而通过xml文件引用图片资源,占用的内存大小如下:
因为通过src属性,我们在获取对应的drawable时,设置的density为0,density为0的情况下,
图片的宽高是不会进行任何的缩放的,故而占用内存大小也不会有任何的改变。
内存占用大小 = 图片原始宽 * 图片原始高 * 色深

所以 如果我是320的手机,我加载xhdpi下的图片,假设图片是 18*12  argb8888 ,那内存占用就是 18*12*4
但如果我只在xxxhdpi下有图片,假设图片是36*24 , 那内存占用就是36*24 * 4,内存占用一下就翻了4倍.

而我们drawable目录下的 图片,几乎都是用于xml引用图片,很少会用bitmapFactory创建,
所以还是每个文件夹下都放对应分辨率的图片是最好的

图片的释放

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,387评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,845评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,091评论 0 246
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,308评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,662评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,795评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,008评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,743评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,466评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,687评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,181评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,531评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,177评论 3 239
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,126评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,862评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,734评论 2 274

推荐阅读更多精彩内容