不少同窗面試的時候常常會遇到這樣的問題,怎樣計算一張圖片所佔的內存,也許你會說先計算像素點也就是圖片的寬*高,而後再乘以每一個像素所佔的內存,就能夠計算獲得,這種方法有必定的正確性,可是要在特定的狀況下,接下來咱們一一來分析。java
首先咱們來了解一下Bitmap.Config,andrdoid官方提供的文檔咱們知道經常使用有以下幾種:面試
名稱 | 位數 | 所佔內存 |
---|---|---|
ALPHA_8 | 8 | 1 |
RGB_565 | 16 | 2 |
ARGB_4444 | 16 | 2 |
ARGB_8888 | 32 | 4 |
咱們知道Bitmap能夠經過decodeStream()以及decodeResource()兩種方法獲取,先來看第一種:代碼以下:bash
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeStream(getAssets().open("demo.jpg"), null, options);
textView.setText(String.valueOf(bitmap.getByteCount()));
複製代碼
爲了便於計算我這裏demo.jpg的寬和高都是100,結果是40000,符合以下計算公式:測試
佔用內存 = 圖片寬度*圖片高度*每一個像素所佔的內存
複製代碼
再把ARGB_8888改爲RGB_565,結果是20000,改爲ARGB_4444也是20000,那麼是否意味着經過decodeStream()方式獲取的Bitmap佔用的內存就是這樣計算呢?非也!請看以下代碼:spa
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeStream(getAssets().open("girl.jpg"), null, options);
textView.setText(String.valueOf(bitmap.getByteCount()));
複製代碼
結果是10000,咱們知道inSampleSize表示的是採樣率,爲2的整數次冪,根據官方文檔解釋,設置了inSampleSize,圖片的寬高對應的縮小inSampleSize倍數,上面的結果也驗證了,因此decodeStream()方式獲取的Bitmap佔用的內存計算公式以下code
佔用內存 = 圖片寬度/inSampleSize*圖片高度/inSampleSize*每一個像素所佔的內存
複製代碼
接下來再來看下decodeResource()方式,以下:cdn
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.girl, options);
textView.setText(String.valueOf(bitmap.getByteCount()));
複製代碼
首先個人的測試手機是720p的,對應的資源文件夾是xhdpi,我把圖片放到對應的文件夾下面,運行如上代碼,得出的結果是10000,貌似也符合以下的公式:blog
佔用內存 = 圖片寬度/inSampleSize*圖片高度/inSampleSize*每一個像素所佔的內存
複製代碼
然而事情沒有那麼簡單,接下來咱們把圖片換個位置,分別放在mdpi、hdpi、以及xxhdpi,結果分別是40000、1795六、4356,有發現什麼規律麼?看下面這個表格圖片
如今能發現規律麼?先說結論,經過 decodeResource() 方式生成的Bitmap,佔用的內存除了和圖片的寬高、options.inPreferredConfig、options.inSampleSize相關以外還和當前設備的 dpi( inTargetDensity ) 與圖片所在文件夾對應的 dpi( inDensity ) 有關,經過上面的結果,咱們能夠知道具體的換算關係以下:佔用內存 = 圖片寬度/inSampleSize*inTargetDensity/inDensity*圖片高度/inSampleSize**inTargetDensity/inDensity*每一個像素所佔的內存
複製代碼
具體爲啥是這樣,咱們下期結合源碼進行分析!ip