當前位置:首頁 » 安卓系統 » androidbitmap獲取大小

androidbitmap獲取大小

發布時間: 2025-02-13 23:47:38

Ⅰ android怎麼壓縮一個bitmap佔用空間大小

在Android應用里,最耗費內存的就是圖片資源。而且在Android系統中,讀取點陣圖Bitmap時,分給虛擬機中的圖片的堆棧大小隻有8M,如果超出了,就會出現OutOfMemory異常。所以,對於圖片的內存優化,是Android應用開發中比較重要的內容。 1) 要及時回收Bitmap的內存 Bitmap類有一個方法recycle(),從方法名可以看出意思是回收。這里就有疑問了,Android系統有自己的垃圾回收機制,可以不定期的回收掉不使用的內存空間,當然也包括Bitmap的空間。那為什麼還需要這個方法呢? Bitmap類的構造方法都是私有的,所以開發者不能直接new出一個Bitmap對象,只能通過BitmapFactory類的各種靜態方法來實例化一個Bitmap。仔細查看BitmapFactory的源代碼可以看到,生成Bitmap對象最終都是通過JNI調用方式實現的。所以,載入Bitmap到內存里以後,是包含兩部分內存區域的。簡單的說,一部分是java部分的,一部分是C部分的。這個Bitmap對象是由Java部分分配的,不用的時候系統就會自動回收了,但是那個對應的C可用的內存區域,虛擬機是不能直接回收的,這個只能調用底層的功能釋放。所以需要調用recycle()方法來釋放C部分的內存。從Bitmap類的源代碼也可以看到,recycle()方法里也的確是調用了JNI方法了的。 那如果不調用recycle(),是否就一定存在內存泄露呢?也不是的。Android的每個應用都運行在獨立的進程里,有著獨立的內存,如果整個進程被應用本身或者系統殺死了,內存也就都被釋放掉了,當然也包括C部分的內存。 Android對於進程的管理是非常復雜的。簡單的說,Android系統的進程分為幾個級別,系統會在內存不足的情況下殺死一些低優先順序的進程,以提供給其它進程充足的內存空間。在實際項目開發過程中,有的開發者會在退出程序的時候使用Process.killProcess(Process.myPid())的方式將自己的進程殺死,但是有的應用僅僅會使用調用Activity.finish()方法的方式關閉掉所有的Activity。 經驗分享: Android手機的用戶,根據習慣不同,可能會有兩種方式退出整個應用程序:一種是按Home鍵直接退到桌面;另一種是從應用程序的退出按鈕或者按Back鍵退出程序。那麼從系統的角度來說,這兩種方式有什麼區別呢?按Home鍵,應用程序並沒有被關閉,而是成為了後台應用程序。按Back鍵,一般來說,應用程序關閉了,但是進程並沒有被殺死,而是成為了空進程(程序本身對退出做了特殊處理的不考慮在內)。 Android系統已經做了大量進程管理的工作,這些已經可以滿足用戶的需求。個人建議,應用程序在退出應用的時候不需要手動殺死自己所在的進程。對於應用程序本身的進程管理,交給Android系統來處理就可以了。應用程序需要做的,是盡量做好程序本身的內存管理工作。 一般來說,如果能夠獲得Bitmap對象的引用,就需要及時的調用Bitmap的recycle()方法來釋放Bitmap佔用的內存空間,而不要等Android系統來進行釋放。 下面是釋放Bitmap的示例代碼片段。 // 先判斷是否已經回收 if(bitmap != null && !bitmap.isRecycled()){ // 回收並且置為null bitmap.recycle(); bitmap = null; } System.gc(); 從上面的代碼可以看到,bitmap.recycle()方法用於回收該Bitmap所佔用的內存,接著將bitmap置空,最後使用System.gc()調用一下系統的垃圾回收器進行回收,可以通知垃圾回收器盡快進行回收。這里需要注意的是,調用System.gc()並不能保證立即開始進行回收過程,而只是為了加快回收的到來。 如何調用recycle()方法進行回收已經了解了,那什麼時候釋放Bitmap的內存比較合適呢?一般來說,如果代碼已經不再需要使用Bitmap對象了,就可以釋放了。釋放內存以後,就不能再使用該Bitmap對象了,如果再次使用,就會拋出異常。所以一定要保證不再使用的時候釋放。比如,如果是在某個Activity中使用Bitmap,就可以在Activity的onStop()或者onDestroy()方法中進行回收。 2) 捕獲異常 因為Bitmap是吃內存大戶,為了避免應用在分配Bitmap內存的時候出現OutOfMemory異常以後Crash掉,需要特別注意實例化Bitmap部分的代碼。通常,在實例化Bitmap的代碼中,一定要對OutOfMemory異常進行捕獲。 以下是代碼示例。 Bitmap bitmap = null; try { // 實例化Bitmap bitmap = BitmapFactory.decodeFile(path); } catch (OutOfMemoryError e) { // } if (bitmap == null) { // 如果實例化失敗 返回默認的Bitmap對象 return defaultBitmapMap; } 這里對初始化Bitmap對象過程中可能發生的OutOfMemory異常進行了捕獲。如果發生了OutOfMemory異常,應用不會崩潰,而是得到了一個默認的Bitmap圖。 經驗分享: 很多開發者會習慣性的在代碼中直接捕獲Exception。但是對於OutOfMemoryError來說,這樣做是捕獲不到的。因為OutOfMemoryError是一種Error,而不是Exception。在此僅僅做一下提醒,避免寫錯代碼而捕獲不到OutOfMemoryError。 3) 緩存通用的Bitmap對象 有時候,可能需要在一個Activity里多次用到同一張圖片。比如一個Activity會展示一些用戶的頭像列表,而如果用戶沒有設置頭像的話,則會顯示一個默認頭像,而這個頭像是位於應用程序本身的資源文件中的。 如果有類似上面的場景,就可以對同一Bitmap進行緩存。如果不進行緩存,盡管看到的是同一張圖片文件,但是使用BitmapFactory類的方法來實例化出來的Bitmap,是不同的Bitmap對象。緩存可以避免新建多個Bitmap對象,避免內存的浪費。 經驗分享: Web開發者對於緩存技術是很熟悉的。其實在Android應用開發過程中,也會經常使用緩存的技術。這里所說的緩存有兩個級別,一個是硬碟緩存,一個是內存緩存。比如說,在開發網路應用過程中,可以將一些從網路上獲取的數據保存到SD卡中,下次直接從SD卡讀取,而不從網路中讀取,從而節省網路流量。這種方式就是硬碟緩存。再比如,應用程序經常會使用同一對象,也可以放到內存中緩存起來,需要的時候直接從內存中讀取。這種方式就是內存緩存。 4) 壓縮圖片 如果圖片像素過大,使用BitmapFactory類的方法實例化Bitmap的過程中,需要大於8M的內存空間,就必定會發生OutOfMemory異常。這個時候該如何處理呢?如果有這種情況,則可以將圖片縮小,以減少載入圖片過程中的內存的使用,避免異常發生。 使用BitmapFactory.Options設置inSampleSize就可以縮小圖片。屬性值inSampleSize表示縮略圖大小為原始圖片大小的幾分之一。即如果這個值為2,則取出的縮略圖的寬和高都是原始圖片的1/2,圖片的大小就為原始大小的1/4。 如果知道圖片的像素過大,就可以對其進行縮小。那麼如何才知道圖片過大呢? 使用BitmapFactory.Options設置inJustDecodeBounds為true後,再使用decodeFile()等方法,並不會真正的分配空間,即解碼出來的Bitmap為null,但是可計算出原始圖片的寬度和高度,即options.outWidth和options.outHeight。通過這兩個值,就可以知道圖片是否過大了。 BitmapFactory.Options opts = new BitmapFactory.Options(); // 設置inJustDecodeBounds為true opts.inJustDecodeBounds = true; // 使用decodeFile方法得到圖片的寬和高 BitmapFactory.decodeFile(path, opts); // 列印出圖片的寬和高 Log.d("example", opts.outWidth + "," + opts.outHeight); 在實際項目中,可以利用上面的代碼,先獲取圖片真實的寬度和高度,然後判斷是否需要跑縮小。如果不需要縮小,設置inSampleSize的值為1。如果需要縮小,則動態計算並設置inSampleSize的值,對圖片進行縮小。需要注意的是,在下次使用BitmapFactory的decodeFile()等方法實例化Bitmap對象前,別忘記將opts.inJustDecodeBound設置回false。否則獲取的bitmap對象還是null。 經驗分享: 如果程序的圖片的來源都是程序包中的資源,或者是自己伺服器上的圖片,圖片的大小是開發者可以調整的,那麼一般來說,就只需要注意使用的圖片不要過大,並且注意代碼的質量,及時回收Bitmap對象,就能避免OutOfMemory異常的發生。 如果程序的圖片來自外界,這個時候就特別需要注意OutOfMemory的發生。一個是如果載入的圖片比較大,就需要先縮小;另一個是一定要捕獲異常,避免程序Crash。

Ⅱ android bitmap 改變圖片大小

Optionsoptions1=newOptions();
options1.inJustDecodeBounds=true;
BitmapFactory.decodeFile(filePath,options1);
options1.inSampleSize=RegisterTool.calculateInSampleSize(options1,110,160);//110,160:轉換後的寬和高,具體值會有些出入
options1.inJustDecodeBounds=false;
Bitmapbitmap=BitmapFactory.decodeFile(filePath,options1);//filePath:文件路徑
(BitmapFactory.Optionsoptions,
intreqWidth,intreqHeight){

finalintheight=options.outHeight;
finalintwidth=options.outWidth;
intinSampleSize=1;

if(height>reqHeight||width>reqWidth){

finalintheightRatio=Math.round((float)height
/(float)reqHeight);
finalintwidthRatio=Math.round((float)width/(float)reqWidth);

inSampleSize=heightRatio<widthRatio?widthRatio:heightRatio;
}

returninSampleSize;
}
//壓縮圖片並將Bitmap保存到本地
FileOutputStreamout=newFileOutputStream(newFile(filePath));
saveBitmap.compress(Bitmap.CompressFormat.JPEG,60,out);//60代表壓縮40%

Ⅲ 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圖片縮放成指定的尺寸.

Ⅳ android開發怎麼得到Bitmap所佔資源的大小

  • 首先得到Bitmap對象所佔資源的大小,在新的API上提供了一個方法


    bitmap.getByteCount() // from API Level 12


    也就是說從SDK12才能使用這個方法,針對以前的版本還是不能使用,那麼怎麼辦?看第二種方法

  • bitmap.getRowBytes() * bitmap.getHeight() //這樣也能很准確的計算出Bitmap所佔內存的大小,方法都是從SDK1就開始存在的。bingo!正解!


    需要注意的是我上面說的兩種方法是得到bitmap對象在內存中所佔的存儲空間大小,其實比實際圖片(比如圖片文件)大,如果想得到文件大小呢?

  • 如何得到bitmap所使用圖片的文件大小?


    bitmap.compress(format, quality, stream)


    至於方法的解釋,參數的傳入自己去看API文檔,最後一個參數是一個OutPutStream對象,得到大小


熱點內容
python集合運算符 發布:2025-02-14 03:06:18 瀏覽:204
pic編譯軟體 發布:2025-02-14 03:01:04 瀏覽:983
反編譯在編譯 發布:2025-02-14 02:55:36 瀏覽:417
python列印對象 發布:2025-02-14 02:51:20 瀏覽:572
QRM演算法 發布:2025-02-14 02:45:19 瀏覽:265
c語言列印結構體 發布:2025-02-14 02:42:28 瀏覽:140
編譯技術實驗一 發布:2025-02-14 02:28:24 瀏覽:647
編程手機入門 發布:2025-02-14 02:27:40 瀏覽:733
區域網視頻android 發布:2025-02-14 02:23:56 瀏覽:423
麒麟系統如何安裝安卓程序 發布:2025-02-14 02:07:21 瀏覽:399