導航:首頁 > 操作系統 > android設置bitmap大小

android設置bitmap大小

發布時間:2023-02-22 23:46:20

1. 關於android系統一次能創建多大的Bitmap

實際操作來看應該是正確的,且看如下實驗:
在創建Bitmap是無論將其width和height初始化多麼大,只要不執行繪圖操作,都不會報OOM(out of memory)錯誤
通過Config.ALPHA_8單位元組設置Bitmap,最後生成的圖片只有一個黑色背景
通過Config.ARGB_4444兩個位元組設置,width*height 最大可以初始化到1006*1006*8,才能保證在繪圖時不提示錯誤
通過Config.ARGB_8888四個位元組設置,width*height 最大可以初始化到1006*1006*4,才能保證在繪圖時不提示錯誤
在上面極限測試過程中,僅能保證第一次繪圖操作正確,再來一次就OOM了
所以由此可以得出如下結論:
Bitmap在創建時是沒有分配內存的(當然了,如果是通過decode方法直接解析圖像文件,應該是會即時分配的;網上一位高手說Android系統一次能讀取的最大文件大小為1M,本人尚未驗證)
1006*1006*8*2大約等於16M

2. Android內存優化五:Bitmap優化

Android內存優化一:java垃圾回收機制
Android內存優化二:內存泄漏
Android內存優化三:內存泄漏檢測與監控
Android內存優化四:OOM
Android內存優化五:Bitmap優化

壓縮比:scale = (flaot) targetDensity / density

targetDensity : 設備屏幕像素密度dpi

density: 圖片對應的文件夾的像素密度dpi

1)、同一張圖片放在不同的資源目錄下,其解析度會有變化。

2)、Bitmap的解析度越高,其解析後的寬高越小,甚至小於原有的圖片(及縮放),從而內存也響應的減少。

3)、圖片不放置任何資源目錄時,其使用默認解析度mdpi:160。

4)、資源目錄解析度和屏幕解析度一致時,圖片尺寸不會縮放。

Bitmap放在資源目錄中的計算方式為:

主要通過編碼、采樣、復用、匿名共享區進行優化

由於ARGB_4444的畫質慘不忍睹,一般假如對圖片沒有透明度要求的話,可以改成RGB_565,相比ARGB_8888將節省一半的內存開銷

其中,A代表透明度;R代表紅色;G代表綠色;B代表藍色。

ALPHA_8 表示8位Alpha點陣圖,即A=8,一個像素點佔用1個位元組,它沒有顏色,只有透明度。

ARGB_4444 表示16位ARGB點陣圖,即A=4,R=4,G=4,B=4,一個像素點佔4+4+4+4=16位,2個位元組。

ARGB_8888 表示32位ARGB點陣圖,即A=8,R=8,G=8,B=8,一個像素點佔8+8+8+8=32位,4個位元組。

RGB_565 表示16位RGB點陣圖,即R=5,G=6,B=5,它沒有透明度,一個像素點佔5+6+5=16位,2個位元組。

bitmap的佔用內存,是以bitmap的寬高和每個像素佔用的位元組數決定的。

根據BitmapFactory 的采樣率進行壓縮 設置采樣率,不能小於1 假如是2 則寬為之前的1/2,高為之前的1/2,一共縮小1/4 以此類推

圖片復用指的是inBitmap這個屬性。

不使用這個屬性,你載入三張圖片,系統會給你分配三份內存空間,用於分別儲存這三張圖片

如果用了inBitmap這個屬性,載入三張圖片,這三張圖片會指向同一塊內存,而不用開辟三塊內存空間。

inBitmap的限制:

1、3.0-4.3

復用的圖片大小必須相同

編碼必須相同

2、4.4以上

復用的空間大於等於即可

編碼不必相同

3、不支持WebP

4、圖片復用,這個屬性必須設置為true;

options.inMutable = true;

Android 系統為了進程間共享數據開辟的一塊內存區域,由於這塊區域不受應用的Head的大小限制,相當於可以繞開oom,FaceBook的Fresco首次應用到實際中。

限制:5.0以後就限制了匿名共享內存的使用。

在SDK 11 -> 18之間,重用的bitmap大小必須是一致的,例如給inBitmap賦值的圖片大小為100-100,那麼新申請的bitmap必須也為100-100才能夠被重用。從SDK 19開始,新申請的bitmap大小必須小於或者等於已經賦值過的bitmap大小。 新申請的bitmap與舊的bitmap必須有相同的解碼格式,例如大家都是8888的,如果前面的bitmap是8888,那麼就不能支持4444與565格式的bitmap了。 我們可以創建一個包含多種典型可重用bitmap的對象池,這樣後續的bitmap創建都能夠找到合適的「模板」去進行重用。

8.0Bitmap的像素數據存儲在Native,為什麼又改為Native存儲呢?

因為8.0共享了整個系統的內存,測試8.0手機如果一直創建Bitmap,如果手機內存有1G,那麼你的應用載入1G也不會oom。

可以利用LRU開管理Bitmap,給他設置內存最大值,及時回收。

BitmapRegionDecoder

3. 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%

4. android中怎麼是bitmap縮小

/**Bitmap放大的方法*/
private static Bitmap big(Bitmap bitmap) {
Matrix matrix = new Matrix();
matrix.postScale(1.5f,1.5f); //長和寬放大縮小的比例
Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
return resizeBmp;
}
這里放大縮小的方法都有:http://www.apkbus.com/thread-311363-1-1.html

5. android圖像繪制——畫布保存為圖片

解釋:

1、首先創建一個Bitmap圖片,並指定大小;

2、在該圖片上創建一個新的畫布Canvas,然後在畫布上繪制,並保存即可;

3、需要保存的目錄File,注意如果寫的目錄如「/sdcard/akai/」如果不存在的話,要先創建(file.mkdirs()),否則FileOutputStream會報錯No found;

4、需要添加許可權:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

什麼是畫布呢 其實通過字面意思的理解就是用來繪畫的地方,那麼android里的畫布是神馬樣子的呢?

在自定義畫布中常用到下面3個類

Canvas

這些繪圖方法中的每一個都需要指定一個Paint對象來渲染它

Paint

Paint也稱為"刷子",Paint可以指定如何將基本圖形繪制到點陣圖上。

Paint類相當於一個筆刷和調色板。它可以選擇如何使用上面描述的draw方法來渲染繪 制在畫布上的基本圖形。通過修改Paint對象,可以在繪圖的時候控制顏色、樣式、字體和特殊效果。最簡單地,setColor可以讓你選擇一個Paint的顏色,而Paint對象的樣式(使用setStyle控制)則可以決定是繪制繪圖對象的輪廓(STROKE),還是只填充每一部 分(FILL),或者是兩者都做(STROKE_AND_FILL)除了這些簡單的控制之外,Paint類還支持透明度,另外,它也可以通過使用各種各樣的陰影、過濾器和效果進行修改,從而提供由更豐富的、復雜的畫筆和顏料組成的調色板。

從繼承View類(或其子類)開始,並定義onDraw()回調方法。系統會調用該方法來完 成View對象自己的繪制請求。這也是通過Canvas對象來執行所有的圖形繪制調用的地方,這個Canvas對象是由onDraw()回調方法傳入的。

Android框架只在必要的時候才會調用onDraw()方法,每次請求應用程序准備完成圖形 繪制任務時,必須通過調用invalidate()方法讓該View對象失效。這表明可以在該View 對象上進行圖形繪制處理了,然後Android系統會調用該View對象的onDraw()方(盡 管不保證該回調方法會立即被調用)。

在定製的View組件的onDraw()方法內部,使用給定的Canvas對象來完成所有的圖形繪制處理(如Canvas.draw…()方法或把該Canvas對象作為參數傳遞給其他類的draw() 方法)。一旦onDraw()方法被執行完成,Android框架就會使用這個Canvas對象來繪制一個有系統處理的Bitmap對象。

下面是Paint一些常用方法:

Bitmap

Bitmap繪圖的表面也稱點陣圖(這里詳細說哈點陣圖的功能)。

從資源中獲取點陣圖:

通過Resource的函數:InputStream openRawResource(int id)獲取得到資源文件的數據流後,可以通過2種方式獲得bitmap

使用BitmapDrawable :

使用BitmapDrawable(InputStream is)構造一個BitmapDrawable;

使用BitmapDrawable類的getBitmap()獲取得到點陣圖;

使用BitmapFactory使用BitmapFactory類decodeStream(InputStream is)解碼位 圖資源,獲取點陣圖BitmapFactory的所有函數都是static,這個輔助類可以通過資 源ID、路徑、文件、數據流等方式來獲取點陣圖。

獲取點陣圖的信息

一般獲取點陣圖信息包括:點陣圖大小、透明度、顏色格式等等,這些信息呢可以通過 三-一方法獲取得到Bitmap就迎刃而解了,Android SDK中對Bitmap有詳細說明,大家可以去詳細了解哈。

顯示點陣圖

顯示點陣圖需要使用核心類Canvas,可以直接通過Canvas類的drawBirmap()顯示點陣圖,或者藉助於BitmapDrawable來將Bitmap繪制到Canvas,下面的實例中會詳細列舉到

點陣圖的縮放

點陣圖的縮放,在Android SDK中提供了2種方法:

1:將一個點陣圖按照需求重畫一遍,畫後的點陣圖就是我們需要的了,與點陣圖的顯示幾乎 一樣:
drawBitmap(Bitmap bitmap, Rect src, Rectdst, Paint paint)

2:在原有點陣圖的基礎上,縮放原點陣圖,創建一個新的點陣圖:
createBitmap(Bitmap source, int x, int y,int width, int height, Matrix m, boolean filter)

點陣圖旋轉

點陣圖的旋轉,離不開Matrix。Android SDK提供了Matrix類,可以通過各種介面來設置 矩陣

android 處理圖片工具

截取視頻幀並轉化為Bitmap

6. 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。

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

8. Android開發中ImageView里的Bitmap很模糊,怎麼解決

目標和容器不一致導致的。
1、設置imageview的scaleType為center,即不隨著控制項的大小而去硬性適配;
2、確保所得bitmap即圖片有預期的大小;
3、設置imageview的寬高為wrap,去適應bitmap的大小。

9. android bitmap 圖片縮放問題

在使用Bitmap進行點陣圖讀取和顯示的時候需要注意在生成點陣圖時,系統會根據不同的情況來縮小、放大圖像。
當把圖片放到drawable文件夾中時,160密度的模擬器顯示的圖像有放大效果,240密度的模擬器顯示原尺寸的圖像。
當把圖片放到drawable-hdpi文件夾中時,160密度的模擬器顯示出的圖像有縮小效果,240密度的模擬器顯示原尺寸的圖像。
當把圖片放到drawable-mdpi文件夾中時,160密度的模擬器顯示原尺寸的圖像,240密度的模擬器顯示放大的圖像。
當把圖片放到drawable-ldpi文件夾中時,160、240密度的模擬器都顯示放大的圖片。
由此可以看出,在使用Bitmap顯示圖像時,一般應放在drawable-hdpi文件夾中,這樣可以根據屏幕的密度來調整圖像大小,比如再做游戲時,大屏幕的與小屏幕的手機中,人物或物體應該有大小之分。望求採納謝謝...

10. Android-Bitmap復用時內存大小計算

主要是Bitmap的這兩個方法得到的Bitmap的值,會在內存復用體現。
如果不使用內存復用,這兩個方法是一樣的效果。

在通過復用 Bitmap 來解碼圖片時,那麼 getByteCount() 表示新解碼圖片佔用內存的大 小,getAllocationByteCount() 表示被復用 Bitmap真實佔用的內存大小。
比如:上面的圖片,黑色區域是當前Bitmap對象實際內存佔用大小,但是這部分內存中,只有紅色區域是新佔用的,而其他的區域是可以復用的但是沒被復用(即Bitmap中新的圖片只是佔用了8個大小,但是Bitmap實際大小其實是有20),那麼如果使用getByteCount()就只會返回被復用區域的內存大小,所以使用getByteCount()返回內存區域的大小,其實是小於等於實際大小的。
以為你Bitmap佔用內存大小,是由最大的圖片來決定的,如果放入一張更小的圖片,其實並不會減少Bitmap佔用的內存大小。
可以認為:
getByteCount()只是圖片的大小
getAllocationByteCount()是Bitmap的大小
因為Bitmap可以復用,所以Bitmap可以放入不同的圖片,當Bitmap放入更大的圖片的時候,就會佔用更大的內存,但是這個時候如果對Bitmap對象進行復用,放入一張小圖片,並不會改變Bitmap的大小。

閱讀全文

與android設置bitmap大小相關的資料

熱點內容
永輝生活app如何使用手機閃付 瀏覽:177
吸奶的電影 瀏覽:985
對越自衛反擊戰電影大全集免費 瀏覽:565
一起看電影網站源碼 瀏覽:909
阿甘正傳阿甘的英文名 瀏覽:159
電影天名 瀏覽:626
弱視矯治系統源碼 瀏覽:899
金融市場基礎知識pdf 瀏覽:383
三沒降頭電影 瀏覽:586
黃色武俠小說txt下載 瀏覽:531
如何將伺服器轉移至阿里平台 瀏覽:744
哪個網站可以看島國片 瀏覽:648
代駕app如何導航到起點 瀏覽:667
機器人穿越外國電影 瀏覽:681
贏在龍頭主圖指標源碼 瀏覽:951
符號加在命令後面 瀏覽:271
沙漏驗機寶檢測安卓手機怎麼樣 瀏覽:369
非洲電影有哪些好看的 瀏覽:763
媒介學pdf 瀏覽:234
推薦一個在線觀看 瀏覽:471