一张图片占用多少内存
⼀张图⽚占⽤多少内存
(以上两篇博客很不错)
100KB。
我们先假设我们有⼀张图⽚时 600 * 800
600 * 800 的,图⽚占⽤空间⼤⼩假设是 100KB
图⽚内存⼤⼩跟占⽤空间⼤⼩有什么关系?
  占⽤空间的⼤⼩不是图⽚占⽤内存的⼤⼩,⼀些初学者可能会误解⼀下。占⽤空间是在磁盘上占⽤的空间,内存⼤⼩是加载到内存中占⽤的内存⼤⼩。两个只是单位是⼀样的,本质不是⼀个概念。
⼀张图⽚到底占⽤多少内存呢?
图⽚⾼度 * 图⽚宽度 * ⼀个像素占⽤的内存⼤⼩
1. 图⽚占⽤内存的计算公式:图⽚⾼度 * 图⽚宽度 * ⼀个像素占⽤的内存⼤⼩
800 * 600 * 4 byte = 1875KB = 1.83M
2. 所以上⾯的图⽚占⽤内存是:800 * 600 * 4 byte = 1875KB = 1.83M
当图⽚放在 res 内的不同⽬录中时,为什么最终图⽚加载进内存所占据的⼤⼩会不⼀样呢?
如果你们去看下Bitmap.decodeResource()源码,你们会发现,系统在加载 res ⽬录下的资源图⽚时,会根据图⽚存放的不同⽬录做⼀次分辨率的转换,⽽转换的规则是:
新图的⾼度 = 原图⾼度 * (设备的 dpi / ⽬录对应的 dpi )
公共场所卫生新图的宽度 = 原图宽度 * (设备的 dpi / ⽬录对应的 dpi )
⽬录名称与 dpi 的对应关系如下,drawable 没带后缀对应 160 dpi:
所以,我们来看下序号 2 的实验,按照上述理论的话,我们来计算看看这张图⽚的内存⼤⼩:
转换后的分辨率:1080 * (240/160) * 452 * (240/160) = 1620 * 678
同⼀图⽚,在同⼀台设备中,如果图⽚放在 res 内的不同资源⽬录下,那么图⽚占⽤的内存空间是会不⼀样的
同⼀图⽚,放在 res 内相同的资源⽬录下,但在不同 dpi 的设备中,图⽚占⽤的内存空间也是会不⼀样的
图⽚优化
所以,如果单从图⽚本⾝考虑优化的话,也就只有两个⽅向:
降低分辨率
减少每个像素点⼤⼩
总结
最后,来稍微总结⼀下:
⼀张图⽚占⽤的内存⼤⼩的计算公式:分辨率 * 像素点⼤⼩;但分辨率不⼀定是原图的分辨率,需要结合⼀些场景来讨论,像素点⼤⼩就⼏种情况:ARGB_8888(4B)、RGB_565(2B) 等等。
2012年4月21日
造句什么像什么如果不对图⽚进⾏优化处理,如压缩、裁剪之类的操作,那么 Android 系统会根据图⽚的不同来源决定是否需要对原图的分辨率进⾏转换后再加载进内存。
图⽚来源是 res 内的不同资源⽬录时,系统会根据设备当前的 dpi 值以及资源⽬录所对应的 dpi 值,做⼀次分辨率转换,规则如下:新分辨率 = 原图横向分辨率 * (设备的 dpi / ⽬录对应的 dpi ) * 原图纵向分辨率 * (设备的 dpi / ⽬录对应的 dpi )。
其他图⽚的来源,如磁盘,⽂件,流等,均按照原图的分辨率来进⾏计算图⽚的内存⼤⼩。
jpg、png 只是图⽚的容器,图⽚⽂件本⾝的⼤⼩与它所占⽤的内存⼤⼩没有什么关系。
基于以上理论,以下场景的出现是合理的:
同个 app,在不同 dpi 设备中,同个界⾯的相同图⽚所占的内存⼤⼩有可能不⼀样。
欧美喜剧电影同个 app,同⼀张图⽚,但图⽚放于不同的 res 内的资源⽬录⾥时,所占的内存⼤⼩有可能不⼀样。
以上场景之所说有可能,是因为,⼀旦使⽤某个热门的图⽚开源库,那么,以上理论基本就不适⽤了。
因为系统⽀持对图⽚进⾏优化处理,允许先将图⽚压缩,降低分辨率后再加载进内存,以达到降低占⽤内存⼤⼩的⽬的非主流经典句子
⽽热门的开源图⽚库,内部基本都会有⼀些图⽚的优化处理操作:
当使⽤ fresco 时,不管图⽚来源是哪⾥,即使是 res,图⽚占⽤的内存⼤⼩仍旧以原图的分辨率计算。
如何销售当使⽤ Glide 时,如果有设置图⽚显⽰的控件,那么会⾃动按照控件的⼤⼩,降低图⽚的分辨率加载。图⽚来源是 res 的分辨率转换规则对它也⽆效。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。