Android圖片開發內幕--基礎篇

前言:原本我是作電視應用的,可是由於公司要出手機,人員緊張,因此就抽調我去支援一下,誰叫俺是雷鋒呢!我作的一個功能就是處理手機中的應用ICON,處理無非就是美化一下,從新與底板進行合成和裁剪,用到了不少Bitmap的知識。原本以前一直想寫一些關於Bitmap的博客,正好這是個機會,所以Bitmap那些事系列博客誕生了。這個系列我會把學習Bitmap的一些知識發佈出來供你們參考和交流。android


        在手機中圖片通常都是指Bitmap圖片,爲何要說Bitmap呢?由於你們在開發應用的時候,都會使用一些圖片來表現UI,用戶也喜歡看圖片,看文字獲取信息太慢而且不直觀,若是美工設計的好,看圖片基本上不怎麼看你的文字內容就知道你要表達什麼,例如全部的購物網站都會編輯不少商品的配圖來呈現給用戶,因而可知圖片在應用程序中的常見和重要。只要說到圖片就不能離開如何避免OOM這個主題,由於在處理不少圖片時很容易出現OOM,那麼學習圖片處理就顯得尤其重要了,下面就讓咱們一步一步學習圖片的相關知識。app

Bitmap圖片佔用內存計算:學習

        Bitmap圖片在加載到內存的時候是按照:寬*高*像素點位數來計算的。你能夠把圖片當作是由width行、height列的矩陣組成,每個矩陣元素表明一個像素點,每個像素點都是1byte整數倍的數據,這個數據越大,表示的色彩就越豐富,圖片的顯示質量就越高。Bitmap中有一個枚舉類Config用來配置圖片的壓縮格式,表明每一個像素是用多大的數據來存儲的,數值越大可以存儲的顏色信息就越多,也就越豐富,顯示效果也就越好。Config.ALPHA_8是1 byte,Config.RGB_565和Config.ARGB_4444都是2 bytes,Config.RGB_565沒有Alpha值因此多用來配置沒有透明度的圖片,Config.ARGB_8888是4 bytes,通常圖片都是按照這個來配置的。下面是獲取配置的代碼:網站


?google

1
2
3
4
5
6
7
8
9
10
11
12
static  int  getBytesPerPixel(Config config) {
    if  (config == Config.ARGB_8888) {
        return  4;
    else  if  (config == Config.RGB_565) {
        return  2;
    else  if  (config == Config.ARGB_4444) {
        return  2;
    else  if  (config == Config.ALPHA_8) {
        return  1;
    }
    return  1;
}


使用圖片你須要注意哪些:spa

一、android系統自身的問題。android系統給每個應用分配了必定的內存空間,分配了多少要看廠家和機型,數值能夠經過Runtime類獲取,Runtime.getRuntime()獲取實例,而後經過maxMemory()方法獲取系統可爲APP分配的最大內存,totalMemory() 獲取APP當前所分配的內存heap空間大小,freeMemory()獲取當前可用的內存,當被耗盡時會自動擴張,可是不會超過maxMemory。下圖爲google官網提供的不一樣分辨率下不一樣的dpi分配的最小內存;.net

 

 

二、須要多大的照片。不少圖片其實在手機上顯示的時候不須要徹底把原圖加載到內存中,好比我手機相機拍了一張照片是4208*3120的,加載到內存中佔用的內存就是52M,這是很恐怖的,兩張照片差很少就把你的app內存給耗光了。通常狀況下你都須要對須要加載的圖片進行處理,這個處理主要是減少圖片尺寸,下降分辨率,好比你的控件顯示就是100*100的大小,那你就要把圖片縮小到100*100。設計

 

三、及時釋放內存。安卓2.3.3(API級別10)以前,Bitmap像素數據和Bitmap對象是分開存儲的,像素數據是存儲在native memory中,對象存儲在Dalvik heap中,native memory中的像素數據不是以一種可預見的方式釋放,可能致使應用程序暫時超過其內存限制和崩潰,因此在Android2.3.3(API 10)以前你必需要調用recycle()方法來釋放掉內存避免出現OOM,固然前提是肯定這個bitmap再也不使用,不然會出現 "Canvas: trying to use a recycled bitmap". 在Android3.0(API 11)以後,Bitmap的像素數據和Bitmap對象一塊兒存儲在Dalvik heap中,因此咱們不用手動調用recycle()來釋放Bitmap對象,內存的釋放都交給垃圾回收器來作。code

 

        以上是學習Bitmap的一些基礎知識和加載到手機內存中須要注意的事項,下一篇博客我會寫如何更好的加載Bitmap,怎樣省內存,怎樣高效。謝謝你們的瀏覽,寫的很差的地方和有任何疑問請留言或者更快的與我交流請添加:coder_online公衆號,這裏不只有個人文章,還有個人小夥伴們的,各類技術分享,不妨你來看看,咱們期待你的到來。也能夠掃描下面的二維碼,duang的一下就找到咱們了。。。。。。。orm

 

                                                

摘自:http://my.oschina.net/u/2335795/blog/400810