[TOC]
## 问题一:内存中如果加载一张 `500*500` 的 `png` 高清图片.应该是占用多少的内存?
`Bitmap` 所占内存大小计算方式:图片长度 x 图片宽度 x 一个像素点占用的字节数
`png` 图片应该有**alpha通道**,所以 `Bitmap.Config` 是 `ARGB_8888` 。4个8位一种占用32位。
500 * 500 * 4 = 1000000Bytes = 0.95MB
## 问题二:加载本地资源图片,是否还是0.95MB呢?
先看一些基础知识(后面有答案) [Android官网-提供备用位图](https://developer.android.google.cn/training/multiscreen/screendensities#TaskProvideAltBmp) 这篇文章链接中的有讲到:
> 要在像素密度不同的设备上提供良好的图形质量,您应该以相应的分辨率在应用中提供每个位图的多个版本(针对每个密度级别提供一个版本)。否则,Android 系统必须缩放位图,使其在每个屏幕上占据相同的可见空间,从而导致缩放失真,如模糊。
![](https://developer.android.google.cn/images/screens_support/devices-density_2x.png)
例如,如果您有一个可绘制位图资源,它在中密度屏幕上的大小为 48x48 像素,那么它在其他各种密度的屏幕上的大小应该为:
* 36x36 (0.75x) - 低密度 (ldpi)
* 48x48(1.0x 基准)- 中密度 (mdpi)
* 72x72 (1.5x) - 高密度 (hdpi)
* 96x96 (2.0x) - 超高密度 (xhdpi)
* 144x144 (3.0x) - 超超高密度 (xxhdpi)
* 192x192 (4.0x) - 超超超高密度 (xxxhdpi)
然后,将生成的图片文件放在 `res/` 下的相应子目录中,系统将根据运行应用的设备的像素密度自动选取正确的文件。之后,每当您引用`@drawable/xxx`时,系统都会根据屏幕的 `dpi` 选择适当的位图。如果您没有为某个密度提供特定于密度的资源,那么系统会选取下一个最佳匹配项并对其进行缩放以适合屏幕。
实测:`1520 x 2688` 大小为 `334.28KB` 图片,屏幕密度为480的手机;
- 放在 `drawable-xxdpi` 下加载到 `Bitmap` 中占用内存为 `16343040(1520*2688*4)`,因为图片不需要进行缩放,所以只需要计算 `ARGB_8888` 占用的字节数就行;
- 放在 `drawable-mdpi` 下加载到 `Bitmap` 中占用内存为 `147087360(1520*3*2688*3*4)` ,因为 `mdip` 到 `xxdpi` 图片的宽高分别会放大`3`倍;
[Bitmap压缩章节-BitmapFactory.Options三件套](https://www.kancloud.cn/book/stven_king/stven_king_android_interview_topic/preview/Bitmap/Bitmap%E5%8E%8B%E7%BC%A9.md) 中详细讲述了其原理。
`nodpi` 目录中的资源被视为与密度无关,系统将不会对它们进行缩放。
*****
文章到这里就全部讲述完啦,若有其他需要交流的可以留言哦~!~!
想阅读作者的更多文章,可以查看我 [个人博客](http://dandanlove.com/) 和公共号:![振兴书城](https://imgconvert.csdnimg.cn/aHR0cDovL3VwbG9hZC1pbWFnZXMuamlhbnNodS5pby91cGxvYWRfaW1hZ2VzLzEzMTk4NzktNjEyYzRjNjZkNDBjZTg1NS5qcGc?x-oss-process=image/format,png)
- 写在前面的话
- Java
- 基础
- Double的比较
- 小数怎么用二进制表示
- 多线程
- 并发和并行
- 线程池
- 线程池背景
- 线程池构造
- 任务阻塞队列
- Flutter
- 基础知识
- Dart基础
- Android
- 项目架构
- View
- 非UI线程更新View
- AlarmManager
- 对比postDelaryed和Timer
- Bitmap
- 加载100M的图片却不撑爆内存
- Bitmap压缩
- Bitmap局部解码
- 计算图片的内存占用
- Android动画
- Android动画类型
- Android动画原理
- 属性动画
- 帧动画
- 补间动画
- 使用动画的注意事项
- Android新特性
- 权限组
- Android23(Marshmallow)-6.0
- Android24(Nougat)-7.0
- Android26(Oreo)-8.0
- Android28(Pie)-9.0
- Android29(Q)-10.0
- AndroidX迁移
- Kotlin
- 关键字
- Kotlin操作符
- CoroutineScope
- Flow
- CoroutineException