一、存儲格式
當(dāng)界面顯示圖片時荠割,不時按圖片大小計算妹卿,而是按(像素點的多少*每個像素點占用的空間大小)來計算的蔑鹦。將圖片加載到內(nèi)存中夺克,是將圖片中的每個像素點都加載到內(nèi)存中,下面我們就來看看config的三種像素ARGB_4444嚎朽、ARGB_8888铺纽、RGB_565
(1)ARGB_4444:A(alpha)占4位,R(red)占4位火鼻,G(Green)占四位室囊,B(Blue)占四位,每個像素點占16位魁索,也就是2字節(jié)的內(nèi)存融撞,同時存儲位圖的透明度和顏色。但該精度的位圖質(zhì)量較差粗蔚,官方不推薦
(2)ARGB_8888:A(alpha)占八位尝偎,R(red)占八位,G(Green)占八位鹏控,B(Blue)占八位致扯,每個像素點占32位,也就是4字節(jié)的內(nèi)存当辐,同時存儲透明度和顏色抖僵。如果一個480*800的位圖設(shè)置了此類型,那它占用的內(nèi)存空間480*800*4/1024*1024=1.46M
3)RGB_565:R(red)占5位缘揪,G(Green)占6位耍群,B(Blue)占5位,每個像素點占16位找筝,相當(dāng)于2個字節(jié)的內(nèi)存蹈垢,只存儲了顏色
二、inSampleSize(采樣率)袖裕,如下圖曹抬,源碼中已經(jīng)有詳細(xì)介紹
如采用ARGB8888的存儲格式,一個1024*1024*4急鳄,也就是4M大小的圖片谤民,采樣率為2堰酿,所占用內(nèi)存為512*512*4大小,也就是占用了1M內(nèi)存
如何選取inSampleSize的值呢赖临?
如果ImageView要求的大小為100*100胞锰,如果圖片大小為200*200,那么insampleSize設(shè)置為2兢榨,圖片大小變?yōu)?00*100嗅榕;如果圖片大小為200*300,inSampleSize=2的話吵聪,圖片大小變?yōu)?00*150凌那,inSampleSize=3的話,圖片大小變?yōu)?6*100吟逝,那么相對于100*100帽蝶,圖片就有拉伸的效果,效果不好?
獲取采樣率块攒,遵循如下流程:
1)將BitmapFactory.Options的inJustDecodeBounds參數(shù)設(shè)為true并加載圖片
2)從BitmapFactory.Options中取出圖片的原始寬高信息
3)根據(jù)采樣率的規(guī)則并結(jié)合目標(biāo)view的所需大小計算出采樣率
4)將BitmapFactory.Options的inJustDecodeBounds設(shè)為false励稳,然后重新加載圖片
詳細(xì)代碼我會上傳github,見https://github.com/wintersweett/App囱井,里的BitmapUtis中方法
具體代碼詳見https://github.com/wintersweett/App.git中的BitmapUtils類