在Android開發中圖片加載每每是致使OOM(Out of Memory)的主要緣由,因此圖片的壓縮不得不做爲Android開發中比用的一項技能點,如下將以簡單的方式進行優化。測試
其實圖片大小的計算是很簡單的,只須要用圖片的width乘以圖片的height而後再乘以每個像素所佔用的字節數,這個字節數須要根據圖片解碼模式來得到,Android中提供了6種方案,不過經常使用的只有三個,在下方已經列出。優化
A:透明度(Alpha)this
R:紅色(Red)code
G:綠(Green)對象
B:藍(Blue)圖片
Bitmap.Config.ARGB_8888
:由4個8位組成,即A=8,R=8,G=8,B=8,那麼一個像素點佔8+8+8+8=32位(4字節)內存
Bitmap.Config.ARGB_4444
:由4個4位組成,即A=4,R=4,G=4,B=4,那麼一個像素點佔4+4+4+4=16位 (2字節)開發
Bitmap.Config.RGB_565
:沒有透明度,R=5,G=6,B=5,,那麼一個像素點佔5+6+5=16位(2字節)get
基礎知識補腦:
8bit(位)=1byte(字節)
1024byte=1KB
1024kb=1MB
1024mb=1GBit
舉例:
一、480x800的圖片,在色彩模式爲ARGB_8888的狀況下
480*800*4/1024/1024=1.46484375MB
二、480x800的圖片,在色彩模式爲ARGB_4444的狀況下
480*800*2/1024/1024=0.732421875MB
經過以上的測試,發現致使過大的緣由主要集中在兩點上,一點是圖片的寬和高零一點則是解碼方式,經過等比例縮放圖片以及切換解碼方式能夠有效的下降圖片的內存佔用。不過在如下的優化方案中還有一種優化就是內存複用技術。
var bitmapOptions = BitmapFactory.Options() bitmapOptions.inJustDecodeBounds = true//設置僅加載圖片的寬高信息不將圖片加載的內存中 BitmapFactory.decodeResource(resources, R.drawable.testimg, bitmapOptions)//獲取圖片的寬高 bitmapOptions.inSampleSize = 4//設置縮放比例(一、縮放圖片) bitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565//設置解碼模式(二、質量壓縮) bitmapOptions.inJustDecodeBounds = false//消除僅加載圖片的寬高 var bitmap = BitmapFactory.decodeResource(resources, R.drawable.testimg, bitmapOptions)//加載圖片到內存(注意添加Option對象) this.imgMain.setImageBitmap(bitmap)//使用Bitmap
inSampleSize的做用就是能夠把圖片的寬高縮小inSampleSize倍,以下代碼設置爲4那麼就是寬高的四分之一,所佔內存縮小inSampleSize的平方。單純的縮放4倍並不充分,只能說治標不治本,比如一個高清50MB的圖片,你縮放4倍仍是涼涼,因此說仍是根據尺寸來計算須要縮放的倍數。
bitmapOptions.inSampleSize =Math.ceil(bitmapOptions.outWidth.toDouble() / targetWidth.toDouble()).toInt()//設置縮放比例(一、縮放圖片)
PS:以上的縮放並不是精確的縮放
何爲內存複用,通俗來講就是我已經建立了一個Bitmap對象了,那麼我接着還想用一個bitmap對象,那麼就能夠複用上一個Bitmap對象,不過這樣作有兩個缺點,第一就是會將以前的圖片覆蓋掉,第二就是後邊加載的圖片必須小於或者等於以前的圖片大小,不然就不行。
var bitmapOptions1 = BitmapFactory.Options() bitmapOptions1.inBitmap = bitmap//綁定一個已經加載的Bitmap對象 var bitmap1 = BitmapFactory.decodeResource(resources, R.drawable.timg, bitmapOptions1)//加載新的Bitmap對象 this.imgMain1.setImageBitmap(bitmap1)//使用Bitmap
推薦使用WEBP格式代替PNG和JPEG圖片格式。
以上所說的只是簡單的圖片壓縮優化,並不是特定專業的優化方式,不過應對通常的項目需求應該仍是能夠知足的。