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

<?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(圖片沒有加載到內存)

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文件夾之間的關係

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章