androidbitmap使用
㈠ android bitmap 圖片縮放問題
在使用Bitmap進行點陣圖讀取和顯示的時候需要注意在生成點陣圖時,系統會根據不同的情況來縮小、放大圖像。
當把圖片放到drawable文件夾中時,160密度的模擬器顯示的圖像有放大效果,240密度的模擬器顯示原尺寸的圖像。
當把圖片放到drawable-hdpi文件夾中時,160密度的模擬器顯示出的圖像有縮小效果,240密度的模擬器顯示原尺寸的圖像。
當把圖片放到drawable-mdpi文件夾中時,160密度的模擬器顯示原尺寸的圖像,240密度的模擬器顯示放大的圖像。
當把圖片放到drawable-ldpi文件夾中時,160、240密度的模擬器都顯示放大的圖片。
由此可以看出,在使用Bitmap顯示圖像時,一般應放在drawable-hdpi文件夾中,這樣可以根據屏幕的密度來調整圖像大小,比如再做游戲時,大屏幕的與小屏幕的手機中,人物或物體應該有大小之分。望求採納謝謝...
㈡ Android 圖片載入(一)高效載入Bitmap 基礎篇
由於Bitmap的特殊性以及Android對單個應用所規定的最大內存限制,我們在同時載入大量Bitmap時很容易發生內存溢出,即我們通常所說的OutOfMemoryError(OOM),因此高效載入Bitmap就成為了每個Android開發者的必備技能。
在學習如何高效地載入Bitmap之前,首先介紹一下如何載入一個Bitmap。我們都知道,Bitmap在Android中通常指的是一張圖片,那麼如何將JPG、PNG等格式的圖片轉換成Bitmap對象呢?BitmapFactory類給我們提供了一些方法:
接下來開始介紹如何高效地載入Bitmap,其實核心思想很簡單: 就是採用BitmapFactory.Options參數來調整圖片尺寸來適配控制項的大小。
假如我們顯示圖片的控制項ImageView寬高為100×100像素,而圖片的尺寸為1024×1024像素,這個時候如果將整個圖片載入進來並顯示到控制項上,自然是很佔用內存資源的。這個時候可以通過BitmapFactory.Options按一定的采樣率載入縮小後的圖片,再將縮小後的圖片顯示到ImageView中,這樣就能減小內存佔用從而在一定程度上避免OOM的發生。
通過BitmapFactory.Options來縮放圖片,主要是使用它的inSampleSize參數,也就是前面提到的采樣率。當采樣率inSampleSize為1時,采樣後的圖片大小為原圖大小;當采樣率inSampleSize>1,比如為2時,采樣後的圖片寬高都為原圖的1/2,即像素降為原圖的1/4,佔用的內存大小也就是原圖的1/4;比較特殊的是,當采樣率inSampleSize<1時,系統會自動將該值當做1來處理。 因此可以得出一個結論:采樣率inSampleSize必須是大於1的整數圖片才會有縮小的效果,並且采樣率同時作用於寬高,也就是說采樣後的圖片會縮小到原圖的1/(inSampleSize^2)。比如inSampleSize=4,那麼縮放比例為1/16。
我們現在知道了,通過采樣率可以提高圖片的載入效率,那麼如何才能計算出最合適的采樣率?我們可以按照如下流程:
接下來以decodeFile方法為例實現圖片的縮放,其他三個方法處理方式類似。
下一篇: Android 圖片載入(二)圖片載入框架Glide 入門篇
《Android開發藝術探索》
㈢ android bitmap 浣跨敤鏃跺欐敞鎰忎粈涔
涓銆 闂棰樼殑鑳屾櫙鍜屾剰涔
鍦ˋndroid縐誨姩搴旂敤寮鍙戜腑錛屽笲itmap鐨勪笉灝忓績澶勭悊錛屽緢瀹規槗寮曡搗紼嬪簭鍐呭瓨絀洪棿鑰楀敖鑰屽艱嚧鐨勭▼搴忓穿婧冮棶棰樸傛瘮濡傛垜浠甯擱亣鍒扮殑闂棰橈細
java.lang.OutofMemoryError: bitmap size exceeds VM budget.
瀵艱嚧璇ラ棶棰樼殑鍑虹幇錛屼竴鑸鐢變互涓嬪嚑鏂歸潰鍘熷洜瀵艱嚧錛
寮曞姩璁懼囦竴鑸瀛樺偍絀洪棿闈炲父鏈夐檺銆傚綋鐒朵笉鍚岃懼囧垎閰嶇粰搴旂敤鐨勫唴瀛樼┖闂存槸涓嶅悓鐨勩備絾鐩稿逛笉浣嗘彁楂樼殑璁懼囧垎杈ㄧ巼鑰岃█錛屽唴瀛樼殑鍒嗛厤浠嶇劧鏄鐩稿圭揣寮犵殑銆
Bitmap瀵硅薄甯稿父鍗犵敤澶ч噺鐨勫唴瀛樼┖闂達紝姣斿傦細瀵逛簬2592*1936鐨勮懼囷紝濡傛灉閲囩敤ARGB_8888鐨勬牸寮忓姞杞藉浘鍍忥紝鍐呭瓨鍗犵敤灝嗚揪鍒19MB絀洪棿銆
鍦ˋnroid App涓緇忓父鐢ㄥ埌ListView錛孷iewPager絳夋帶浠訛紝榪欎簺鎺т歡甯鎬細鍖呭惈杈冨ぇ鏁伴噺鐨勫浘鐗囪祫婧愩
浜屻 闂棰樺強鍦烘櫙鍒嗘瀽
1 楂樻晥鍦板姞杞藉ぇ鍥劇墖銆
BitmapFactory綾繪彁渚涗簡涓浜涘姞杞藉浘鐗囩殑鏂規硶錛歞ecodeByteArray(), decodeFile(), decodeResource(), 絳夌瓑銆
涓轟簡閬垮厤鍗犵敤杈冨ぇ鍐呭瓨錛岀粡甯鎬嬌鐢˙itmapFactory.Options 綾伙紝璁劇疆inJustDecodeBounds灞炴т負true銆
//
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds =true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
涓轟簡閬垮厤java.lang.OutOfMemory 鐨勫紓甯革紝鎴戜滑鍦ㄧ湡姝decode鍥劇墖涔嬪墠媯鏌ュ畠鐨勫昂瀵革紝闄ら潪浣犵『瀹氳繖涓鏁版嵁婧愭彁渚涗簡鍑嗙『鏃犺鐨勫浘鐗囦笖涓嶄細瀵艱嚧鍗犵敤榪囧氱殑鍐呭瓨銆
鍔犺澆涓涓鎸夋瘮渚嬬緝灝忕殑鐗堟湰鍒板唴瀛樹腑銆備緥濡傦紝濡傛灉鎶婁竴涓鍘熷浘鏄1024*768 pixel鐨勫浘鐗囨樉紺哄埌ImageView涓128*96 pixel鐨勭緝鐣ュ浘灝辨病鏈夊繀瑕佹妸鏁村紶鍥劇墖閮藉姞杞藉埌鍐呭瓨涓銆備負浜嗗憡璇夎В鐮佸櫒鍘誨姞杞戒竴涓杈冨皬鐨勫浘鐗囧埌鍐呭瓨錛岄渶瑕佸湪浣犵殑BitmapFactory.Options 涓璁劇疆 inSampleSize 涓簍rue 銆備緥濡, 涓涓鍒嗚鯨鐜囦負2048x1536 鐨勫浘鐗囷紝濡傛灉璁劇疆inSampleSize 涓4錛岄偅涔堜細浜у嚭涓涓澶ф備負512x384鐨勫浘鐗囥傚姞杞借繖寮犲皬鐨勫浘鐗囦粎浠呬嬌鐢ㄥぇ姒0.75MB錛屽傛灉鏄鍔犺澆鍏ㄥ浘閭d箞澶ф傝佽姳璐12MB(鍋囪綽itmap鐨勯厤緗鏄疉RGB_8888).
2 涓嶈佸湪涓葷嚎紼嬪勭悊鍥劇墖銆
浼楁墍鍛ㄧ煡鐨勯棶棰橈紝涓嶅啀璧樿堪銆
娉ㄦ剰涓ょ偣錛1. 涓轟簡淇濊瘉浣跨敤鐨勮祫婧愯兘琚鍥炴敹錛屽緩璁浣跨敤WeakReference, 浠ュ簲鐢ㄥ唴瀛樺唴瀛樼揣寮犳椂錛屽洖鏀墮儴鍒嗚祫婧愶紝淇濊瘉紼嬪簭榪涚▼涓嶈鏉姝匯
2. 閬垮厤寮傛ヤ換鍔$殑闀挎椂闂磋楁椂鎿嶄綔錛屽湪浠誨姟鎵ц岀粨鏉熷悗錛屽強鏃墮噴鏀捐祫婧愩
3 綆$悊Bitmap鍐呭瓨銆
鍦ˋndroid寮鍙戜腑錛屽姞杞戒竴涓鍥劇墖鍒扮晫闈㈠緢瀹規槗錛屼絾濡傛灉涓嬈″姞杞藉ぇ閲忓浘鐗囧氨澶嶆潅澶氫簡銆傚湪寰堝氭儏鍐典笅錛堟瘮濡傦細ListView,GridView鎴朧iewPager錛夛紝鑳藉熸粴鍔ㄧ殑緇勪歡闇瑕佸姞杞界殑鍥劇墖鍑犱箮鏄鏃犻檺澶氱殑銆
鏈変簺緇勪歡鐨刢hild view鍦ㄤ笉鏄劇ず鏃朵細鍥炴敹錛屽苟寰鐜浣跨敤錛屽傛灉娌℃湁浠諱綍瀵筨itmap鐨勬寔涔呭紩鐢ㄧ殑璇濓紝鍨冨溇鍥炴敹鍣ㄤ細閲婃斁浣犲姞杞界殑bitmap銆傝繖娌′粈涔堥棶棰橈紝浣嗗綋榪欎簺鍥劇墖鍐嶆℃樉紺虹殑鏃跺欙紝瑕佹兂閬垮厤閲嶅嶅勭悊榪欎簺鍥劇墖錛屼粠鑰岃揪鍒板姞杞芥祦鐣呯殑鏁堟灉錛屽氨瑕佷嬌鐢ㄥ唴瀛樼紦瀛樺拰鏈鍦扮紦瀛樹簡錛岃繖浜涚紦瀛樺彲浠ヨ╀綘蹇閫熷姞杞藉勭悊榪囩殑鍥劇墖銆
3.1 鍐呭瓨緙撳瓨
鍐呭瓨緙撳瓨浠ョ壓鐗插唴瀛樼殑浠d環錛屽甫鏉ュ揩閫熺殑鍥劇墖璁塊棶銆侺ruCache綾伙紙API Level 4涔嬪墠鍙浠ヤ嬌鐢⊿upport Library錛夐潪甯擱傚悎鍥劇墖緙撳瓨浠誨姟錛屽湪涓涓狶inkedHashMap涓淇濆瓨鐫瀵笲itmap鐨勫己寮曠敤錛屽綋緙撳瓨鏁伴噺瓚呰繃瀹瑰櫒瀹歸噺鏃訛紝鍒犻櫎鏈榪戞渶灝戜嬌鐢ㄧ殑鎴愬憳錛圠RU錛夈
娉ㄦ剰錛氬湪榪囧幓錛岄潪甯告祦琛岀敤SoftReference鎴朩eakReference鏉ュ疄鐜板浘鐗囩殑鍐呭瓨緙撳瓨錛屼絾鐜板湪涓嶅啀鎺ㄨ崘浣跨敤榪欎釜鏂規硶浜嗐傚洜涓轟粠Android 2.3 錛圓PI Level 9錛変箣鍚庯紝鍨冨溇鍥炴敹鍣ㄤ細鏇寸Н鏋佺殑鍥炴敹soft/weak鐨勫紩鐢錛岃繖灝嗗艱嚧浣跨敤soft/weak寮曠敤鐨勭紦瀛樺嚑涔庢病鏈夌紦瀛樻晥鏋溿傞『甯︿竴鎻愶紝鍦ˋndroid3.0錛圓PI Level 11錛変互鍓嶏紝bitmap鏄鍌ㄥ瓨鍦╪ative 鍐呭瓨涓鐨勶紝鎵浠ョ郴緇熶互涓嶅彲棰勮佺殑鏂瑰紡鏉ラ噴鏀綽itmap錛岃繖鍙鑳戒細瀵艱嚧鐭鏃墮棿瓚呰繃鍐呭瓨闄愬埗浠庤岄犳垚宕╂簝銆 鏀惰搗