ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[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)