Android 中圖片是以 bitmap 形式存在的,那么 bitmap 所占內存,直接影響到了應用所占內存大小,首先要知道 bitmap 所占內存大小計算方式:
像素數 x 像素大小
=
圖片長度(單位為像素)x 圖片寬度(單位為像素)x 一個像素點占用的字節數
可采用的壓縮方法:
- 質量壓縮:內存不變,壓縮轉化后的 bytes.length 減少,適用于傳輸,png 無效
- 采樣率壓縮(Options):改變寬高,減少像素,采用一定的采樣算法
- 縮放法壓縮(Matrix):改變寬高,減少像素,采用一定的縮放算法(數字圖像處理相關)
- RGB_565:改變字節數
一、質量壓縮
樣板代碼:
說明:
使用 JPEG 格式的質量壓縮
bmRaw.compress(Bitmap.CompressFormat.JPEG, 50, baos)
- 對一張透明圖片(png),內存、寬高不變,bytes.length 減少。圖片會失去透明度,透明處變黑,
- 對一張非透明圖片(png、jpg),內存、寬高不變,bytes.length 減少。
使用 PNG 格式的質量壓縮
bmRaw.compress(Bitmap.CompressFormat.PNG, 50, baos)
- 對一張透明圖片(png),沒有影響
- 對一張非透明圖片(png、jpg),沒有影響
二、采樣率
樣板代碼:
說明:
The sample size is the number of pixels in either dimension that correspond to a single pixel in the decoded bitmap. 樣本大小是在解碼位圖中對應于單個像素的任一維度上的像素個數。也就是說,如果 inSampleSize = 2,采樣后的一個像素在 x 軸上相當于之前的 2 個像素,在 y 軸上也相當于之前的 2 個像素。 即采樣后的一個像素相當于之前的 2*2=4 個像素。
三、縮放法
樣板代碼:
說明:
與采樣率法類似。
四、RGB_565
樣板代碼:
val options = BitmapFactory.Options() options.inPreferredConfig = Bitmap.Config.RGB_565 val bmNew = BitmapFactory.decodeResource(resources, drawableId, options)
說明:
ALPHA_8 代表8位Alpha位圖,一個像素1個字節 ARGB_4444 代表16位ARGB位圖,一個像素2個字節 ARGB_8888 代表32位ARGB位圖,一個像素4個字節 RGB_565 代表16位RGB位圖,一個像素2個字節
如果 inPreferredConfig 不為 null,解碼器會嘗試使用此參數指定的顏色模式來對圖片進行解碼,如果 inPreferredConfig 為 null 或者在解碼時無法滿足此參數指定的顏色模式,解碼器會自動根據原始圖片的特征以及當前設備的屏幕位深,選取合適的顏色模式來解碼,例如,如果圖片中包含透明度,那么對該圖片解碼時使用的配置就需要支持透明度,默認會使用 ARGB_8888 來解碼。所以直接設置 RGB_565:
- 對于一張透明圖片(png),內存、寬高不變,bitmap 也不會失去透明度。
- 對于一張非透明圖片(png、jpg),寬高不變,內存減小。
copy 一遍可以減少內存,但生成的 bitmap 會失去透明度,透明處變黑。
val bmScaled = bmRaw.copy(Bitmap.Config.RGB_565, true)
五、最后
漫漫開發之路,我們只是其中的一小部分……只有不斷的學習、進階,才是我們的出路!才跟得上時代的進步!
今年年初我花一個月的時間收錄整理了一套知識體系,如果有想法深入的系統化的去學習的,可以私信我【安卓】,我會把我收錄整理的資料都送給大家,幫助大家更快的進階。
重要的事說三遍,轉發+轉發+轉發,讓更多需要的朋友們都可以看到并且領到!