標籤:
前言:本來我是做電視應用的,但是因為公司要出手機,人員緊張,所以就抽調我去支援一下,誰叫俺是雷鋒呢!我做的一個功能就是處理手機中的應用ICON,處理無非就是美化一下,重新與底板進行合成和裁剪,用到了很多Bitmap的知識。本來之前一直想寫一些關於Bitmap的部落格,正好這是個機會,因此Bitmap那些事系列部落格誕生了。這個系列我會把學習Bitmap的一些知識發布出來供大家參考和交流。
在手機中圖片一般都是指Bitmap圖片,為什麼要說Bitmap呢?因為大家在開發應用的時候,都會使用一些圖片來表現UI,使用者也喜歡看圖片,看文字擷取資訊太慢並且不直觀,如果美工設計的好,看圖片基本上不怎麼看你的文字內容就知道你要表達什麼,例如所有的購物網站都會編輯很多商品的配圖來呈現給使用者,由此可見圖片在應用程式中的常見和重要。只要說到圖片就不能離開如何避免OOM這個主題,因為在處理很多圖片時很容易出現OOM,那麼學習圖片處理就顯得尤為重要了,下面就讓我們一步一步學習圖片的相關知識。
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,一般圖片都是按照這個來配置的。下面是擷取配置的代碼:
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;}
使用圖片你需要注意哪些:
1、android系統自身的問題。android系統給每一個應用程式指派了一定的記憶體空間,分配了多少要看廠家和機型,數值可以通過Runtime類擷取,Runtime.getRuntime()擷取執行個體,然後通過maxMemory()方法擷取系統可為APP分配的最大記憶體,totalMemory() 擷取APP當前所分配的記憶體heap空間大小,freeMemory()擷取當前可用的記憶體,當被耗盡時會自動擴張,但是不會超過maxMemory。為google官網提供的不同解析度下不同的dpi分配的最小記憶體;
2、需要多大的照片。很多圖片其實在手機上顯示的時候不需要完全把原圖載入到記憶體中,比如我手機相機拍了一張照片是4208*3120的,載入到記憶體中佔用的記憶體就是52M,這是很恐怖的,兩張照片差不多就把你的app記憶體給耗光了。一般情況下你都需要對需要載入的圖片進行處理,這個處理主要是減小圖片尺寸,降低解析度,比如你的控制項顯示就是100*100的大小,那你就要把圖片縮小到100*100。
3、及時釋放記憶體。安卓2.3.3(API層級10)之前,Bitmap像素資料和Bitmap對象是分開儲存的,像素資料是儲存在native memory中,Object Storage Service在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對象,記憶體的釋放都交給記憶體回收行程來做。
以上是學習Bitmap的一些基礎知識和載入到手機記憶體中需要注意的事項,下一篇部落格我會寫如何更好的載入Bitmap,怎樣省記憶體,怎樣高效。謝謝大家的瀏覽,寫的不好的地方和有任何疑問請留言或者更快的與我交流請添加:coder_online 公眾號,這裡不僅有我的文章,還有我的小夥伴們的,各種技術分享,不妨你來看看,我們期待你的到來。也可以掃描下面的二維碼,duang的一下就找到我們了。。。。。。。
摘自:http://my.oschina.net/u/2335795/blog/400810
Android 圖片開發內幕系列第一篇