近乎完全搞懂Bitmap的內存計算(一)

前言

不少同窗面試的時候常常會遇到這樣的問題,怎樣計算一張圖片所佔的內存,也許你會說先計算像素點也就是圖片的寬*高,而後再乘以每一個像素所佔的內存,就能夠計算獲得,這種方法有必定的正確性,可是要在特定的狀況下,接下來咱們一一來分析。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

相關文章
相關標籤/搜索