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