Android 图片处理之不同res-dpi文件夹下图片的内存大小计算

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


<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(图片没有加载到内存)

Alt text

picture in mipmap-hdpi

Alt text

picture in mipmap-mdpi

Alt text

picture in mipmap-xhdpi

Alt text

picture in mipmap-xxhdpi

Alt text

picture in mipmap-xxxhdpi

Alt text

分析(单位: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文件夹之间的关系

你可能感兴趣的:(Android,屏幕适配,内存优化,性能优化,基础)