Android 图片处理之不同res-dpi文件夹下图片的内存大小计算
资源:
- 图片:资源图片
- 图片分辨率: 1920x1080
- 设备: 华为青春版平板(FDR-A10w)
- 设备分辨率: 1200*1920
- 适用资源文件夹:hdpi(如何确定设备的res dpi)
- 源码
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/test" //没有加载到内存时去掉当前行代码
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
将资源图片每次移动到同资源文件夹下的内存:
no loading picture(图片没有加载到内存)
picture in mipmap-hdpi
picture in mipmap-mdpi
picture in mipmap-xhdpi
picture in mipmap-xxhdpi
picture in mipmap-xxxhdpi
分析(单位:M)
不同文件夹内存分布
资源文件夹 | Total | Java | Native | Graphics | Stack | Code | Others |
---|---|---|---|---|---|---|---|
no(不加载到内存) |
13.4 |
3.7 |
3.9 |
0.3 |
0.2 |
2.7 |
2.5 |
同一张图片,在不同文件夹下加载到内存数据
资源文件夹 | Total | Java | Native | Graphics | Stack | Code | Others |
---|---|---|---|---|---|---|---|
mipmap-mdpi | 21.8 | 11.6 | 3.9 | 0.9 | 0.2 | 2.7 | 2.5 |
mipmap-mdpi | 32.1 | 21.2 | 3.9 | 1.5 | 0.2 | 2.7 | 2.5 |
mipmap-xhdpi | 18.2 | 8.1 | 4.0 | 0.7 | 0.2 | 2.7 | 2.5 |
mipmap-xxhdpi | 15.7 | 5.7 | 3.9 | 0.5 | 0.2 | 2.7 | 2.5 |
mipmap-xxxhdpi | 14.6 | 4.8 | 3.9 | 0.5 | 0.2 | 2.7 | 2.5 |
通过上述表格数据可得出同一张图片在不同res-dpi文件夹下加载到内存中内存占用大小是比一样的。
同一张图片,在不同文件夹下加载到内存与不加载到内存的差异
资源文件夹 | Total | Java | Native | Graphics | Stack | Code | Others |
---|---|---|---|---|---|---|---|
mipmap-hdpi | 8.4 | 7.9 | 0 | 0.6 | 0 | 0 | 0 |
mipmap-mdpi | 18.7 | 21.2 | 0 | 1.2 | 0 | 0 | 0 |
mipmap-xhdpi | 4.8 | 8.1 | 0.1 | 0.4 | 0 | 0 | 0 |
mipmap-xxhdpi | 2.3 | 5.7 | 0 | 0.2 | 0 | 0 | 0 |
mipmap-xxxhdpi | 1.2 | 4.8 | 0 | 0.2 | 0 | 0 | 0 |
在Android中默认使用的是ARGB_8888相对于其他格式,ARGB_8888的内存占用是最大的,但是也算最清晰的。
公式及解析:
图片内存计算公式:
图片内存 = 长*宽 * 图片每个像素的内存占用大小(一个像素点占用的字节数)
;以图片格式ARGB_8888为例,每个像素占用A、R、G、B四个通道,每个通道占用8位,所以描述一个像素需要32位即4个字节。一个颜色通道需要8位描述,2^8=256,所以每个颜色通道就有256种状态。如果把彩色图转化成灰阶图的话,也有256种状态分割从白色到黑色之间的过渡颜色。
注意不同图片格式内存计算方式(单位:字节)
图片格式(Bitmap.Config) | 图片每个像素的内存占用大小 | 图片占用内存(分辨率:X*Y) |
---|---|---|
ALPHA_8 | 1 | x*y |
ARGB_4444 | 2 | x*y*2 |
ARGB_8888 | 4 | x*y*4 |
RGB_565 | 2 | x*y*2 |
参考链接:https://developer.android.google.cn/reference/android/graphics/Bitmap.Config
验证:
不同文件夹加载图片到内存与不加载到内存的差异
资源文件夹 | 计算方式 | Total | Java | Native | Graphics | Stack | Code | Others |
---|---|---|---|---|---|---|---|---|
mipmap-hdpi | 8.4 | 7.9 | 0 | 0.6 | 0 | 0 | 0 | |
mipmap-mdpi | 18.7 | 21.2 | 0 | 1.2 | 0 | 0 | 0 | |
mipmap-xhdpi | 4.8 | 8.1 | 0.1 | 0.4 | 0 | 0 | 0 | |
mipmap-xxhdpi | 2.3 | 5.7 | 0 | 0.2 | 0 | 0 | 0 | |
mipmap-xxxhdpi | 1.2 | 4.8 | 0 | 0.2 | 0 | 0 | 0 |
验证
当前设备识别的res-dpi文件夹是hdpi,通过计算图片在hdpi文件夹下的内存进行验证;按照上述的图片内存计算公式计算,1920x1080分辨率图片的内存 = 1920 * 1080 *
图片每个像素的内存占用大小
;因为我们使用的图片格式默认是ARGB_8888,所以我们的图片每个像素的内存占用大小
=4(字节)
,所以分辨率为1920x1080并且格式为ARGB_8888图片的内存内存 = 1920 * 1080 *4 = 8100k =7.910M。未完待续
总结
图片内存计算公式:
图片内存 = 长*宽 * 图片每个像素的内存占用大小(一个像素点占用的字节数)
;
内存计算公式验证是成功的,能对上不同文件夹加载图片到内存与不加载到内存的差异表中mipmap-hdpi 的Java内存大小(有一些误差),有兴趣的可以继续验证其他组数据。
图片与不同(dpi)资源文件夹的关系详细分析可参考:Android 屏幕适配之不同res-dpi文件夹之间的关系