這是字節面試官問的一個問題,平時Glide用慣了,讓我說大圖加載原理答不上來。
大圖如果直接加載到內存,往往會導致OOM,因為大圖所占內存非常大。
Bitmap直接加載
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage);
imageView.setImageBitmap(bitmap);
直接從資源中加載,方法非常簡單,拿到Bitmap對象然后塞入ImageView中即可。這方式小圖片還能正常加載,大圖片就有問題了。
大圖加載步驟
- 獲取大圖尺寸
- 獲取ImageVIew的尺寸,縮放減小內存
- 加載
大圖尺寸獲取
BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.qb, options);
執行結果可以看到bitmap並未加載,而是獲取到了圖片的大小:outHeight和outWidth
減小內存
- 根據ImageView大小計算縮放比例inSampleSize
- 選擇占內存小的顏色模式,設置option.inPreferredConfig,有以下值可以選擇
參數取值 | 含義 |
ALPHA_8 | 圖片中每個像素用一個字節(8位)存儲,該字節存儲的是圖片8位的透明度值 |
RGB_565 | 圖片中每個像素用兩個字節(16位)存儲,兩個字節中高5位表示紅色通道,中間6位表示綠色通道,低5位表示藍色通道 |
ARGB_4444 | 圖片中每個像素用兩個字節(16位)存儲,Alpha,R,G,B四個通道每個通道用4位表示 |
ARGB_8888 | 圖片中每個像素用四個字節(32位)存儲,Alpha,R,G,B四個通道每個通道用8位表示 |