androidbitmap失真
1. 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錛岃繖鍙鑳戒細瀵艱嚧鐭鏃墮棿瓚呰繃鍐呭瓨闄愬埗浠庤岄犳垚宕╂簝銆 鏀惰搗
2. Android開發中ImageView里的Bitmap很模糊,怎麼解決
背景和前景大小比列一定要一致,否則比列會把線條拉伸變得模糊
3. bitmap縮放到指定大小-android中怎麼是bitmap縮小
如何對圖片進行縮放到適應屏幕大小呀/**顯示圖片,使用BitmapFactory()*path
*圖片SD卡路徑****/
privatevoidshow_Image(Stringpath){
//TODOAuto-generatedmethodstub
opts=new();
=2;//寬高設置成原來的1/2
Bitmapbit=newBitmapFactory().decodeFile(path,opts);
show_(bit);
還有很多屬性,你去查查吧,另外如果非要適應屏幕大小的話,你還需要獲取屏幕的大小,然後圖片大小跟屏幕大小比較,沒弄過一定要圖片跟屏幕大小填充滿的判空,就算填充滿,一定也會失真
android中怎麼是bitmap縮小/**Bitmap放大的方法*/
privatestaticBitmapbig(Bitmapbitmap){
Matrixmatrix=newMatrix();
(1.5f,1.5f);//長和寬放大縮小的比例
BitmapresizeBmp=(bitmap,0,0,(),(),matrix,true);
returnresizeBmp;
}
這里放大縮小的方法都有:
android縮放和壓縮的區別android縮放和壓縮圖片可以如下解釋虧蠢:
壓縮圖片
這里簡單的將一個圖片文件轉換為Bitmap,並且在轉換的過程中對圖片質量進行簡單壓縮:
(,intquality,FileOutputStreamfos);
注意這里的quality的范圍為0~100,經過測試如果這個值設置比較低的話圖片會非常不清晰,基本不可用,0~100的值可以參考類似Photoshop之類輸出圖片時選擇的圖片質量.
此方法只是單純對圖片質量進行處理,並不會改變其大小,如果需要改變圖片文件的大小,最好是使用縮放,這個可以在保證一定的圖片清晰度的情況下減少了圖片大小,畢竟手機屏幕就那麼點,你把2000px*1000px的圖片改為500px*250px在手機用戶看來也不會有太嚴重的不適感,而如果你只設置圖片的quality想來改變文件大小,你最後會發現得到的是一個2000px*1000px的幾個色塊.
縮放圖片
先提代碼看看:
[java]viewplain
/**
*保持長寬比縮小Bitmap
*
*@parambitmap
*@parammaxWidth
*@parammaxHeight
*@return
*/
publicBitmapresizeBitmap(Bitmapbitmap,intmaxWidth,intmaxHeight){
intoriginWidth=();
intoriginHeight=();
//noneedtoresize
if(originWidth<maxWidth&&originHeight<maxHeight){
returnbitmap;
}
intwidth=originWidth;
intheight=originHeight;
//若圖片過寬,則保持長寬比縮放圖片
if(originWidth>maxWidth){
width=maxWidth;
doublei=originWidth*1.0/maxWidth;
height=(int)(originHeight/i);
bitmap=(bitmap,width,height,false);
}
//若圖片過長,則從上端截取
if(height>maxHeight){
height=maxHeight;
bitmap=(bitmap,0,0,width,height);
}
//Log.i(TAG,width+"width");
//Log.i(TAG,height+"height");
returnbitmap;
}
這里演掘空瞎示是將圖片縮小到一個max范圍內,而不是直接將變成硬性的變成某個尺寸的圖片,因為一般來說這種設置max的方式符合大部分需要,如果必須將圖片變成某個指定尺寸可以直接使用方法,也是下面要介紹的.
此函數主要就是使用了Bitmap的兩個靜態方法,一個是:
(Bitmapsrc,intdstWidth,intdstHeight,booleanfilter)
此方法就會把一個Bitmap圖片縮放成指定的尺寸.