深色模式
Android 图片大小
图片大小分为占用磁盘的大小,和占用内存的大小。占用磁盘的大小,即是图片文件的大小;占用内存的大小,是图片加载以后占用的内存大小。
占用磁盘大小:文件大小
图片文件大小不是图片占用内存大小,而是占用磁盘大小,一般会经过压缩。
jpg、png是文件压缩格式,不影响图片加载到内存中的大小。
- jpg:有损压缩,不支持透明度。
- png:无损压缩,支持透明度。
占用内存大小:分辨率 * 像素点大小
1 Byte = 8 bit
1 KB = 1024 Byte
1 MB = 1024 KB
1 GB = 1024 MB
例如:一张图片,分辨率是600*800,以ARGB_4444
格式加载,占用内存就是
600 * 800 * 2Byte = 960000Byte = 937.5KB = 0.9155MB
分辨率转换
自动转换
图片被加载时,分辨率可能会被转换,Android系统默认的转换规则如下:
图片来源是res目录时,系统会根据设备dpi和目录dpi对图片分辨率做一次转换
size = rawSize * (inDensity / inTargetDensity)
rawSize:图片原来的分辨率,即宽或高。
inDensity:设备dpi。
inTargetDensity:目标dpi,取决于图片资源所在的目录,drawable-mdpi,drawable-hdpi,drawable-xhdpi,drawable-xxhdpi等。
图片来源是其它,如磁盘、文件、流等,分辨率不做转换。
手动转换
系统还提供了手动转换分辨率的API:
BitmapFactory.Options.inSampleSize
:采样率,inSampleSize
为2则宽高皆除以2。
像素点大小
格式 | 大小 |
---|---|
ALPHA_8 | 1Byte |
RGB_565 | 2Byte |
ARGB_4444 | 2Byte |
ARGB_8888(默认) | 4Byte |
RGBA_F16 | 8Byte |
图片占用内存优化
思路有两点:
减少像素点大小,调整图片色彩格式。
降低分辨率,通过
BitmapFactory.Options.inSampleSize
调整分辨率。
具体如何优化,开源库已经帮我们做好了,简单说一下开源库的优化策略:
Glide
根据控件大小改变图片的分辨率。这是Glide的默认行为,我们仍然可以通过Glide提供的api修改分辨率。
Fresco
图片总是原分辨率,即不应用系统默认的转换规则。