導航:首頁 > 文件教程 > bitmap文件大小

bitmap文件大小

發布時間:2022-10-19 12:55:23

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

B. bitmap把原圖左右分割保存 再把兩張圖片合成保存 原圖大小16.2m 合成後的圖片50.9m

打開後 效果一樣的圖片,為什麼文件大小不一樣呢?
首先 我解釋下圖片的文件存儲邏輯,

圖片文件最主要的是存儲構成圖片信息的每個像素點信息。
而每個像素點信息中包含色彩信息。

通常,圖片文件為了便於保存和傳輸,將採用一定的演算法(也即壓縮格式)來保存上述信息。

因此,同一張圖片,雖然效果一樣,但可能存在像素不同、壓縮損耗不同、壓縮比不同等因素,就早晨過了最終文件大小的不同。

通過bitmap 分割和合並操作後文件的上述壓縮信息產生變化。 所以導致了最終文件大於最初文件。

C. 怎麼獲取BITMAP大小

首先 bitmap在內存里是未壓縮的 存儲每個像素然後 你到底要的是bitmap的大小還是圖片文件的大小

D. 什麼是bitmap文件

BIT是位 MAP是圖,合起來就是點陣圖~這種格式與jpg等文件想區別的是他不是那種壓縮格式,沒有犧牲圖象的質量,而與PNG等矢量文件相比他就是記錄了一張圖片里每個「點」的信息,如一個點的顏色,深淺等,而JPG就是壓縮了相近的顏色區域而減少了文件大小~而PNG文件呢,就是說他記錄的「線」的信息,如一個正方形是4個邊組成,每個邊是什麼顏色的?這個正方形是什麼顏色的,等等信息,而不是如實的去記錄這個正方形上的每個的點的信息~

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

F. 什麼是bitmap文件

點陣圖文件(bitmap),擴展名是.bmp或者.dib。點陣圖是windows標准格式圖形文件,它將圖像定義為由點(像素)組成,每個點可以由多種色彩表示,非壓縮格式的,占存儲空間,不在網路上傳送。jpg格式彌補點陣圖文件這個缺點

G. Bitmap 究竟佔多大內存

實際情況:一張 522x686 的 PNG 圖片,我把它放到 drawable-xxhdpi 目錄下,在三星s6上載入,佔用內存2547360B。

自己計算的情況:一張522*686的PNG 圖片,我把它放到 drawable-xxhdpi 目錄下,在三星s6上載入。其中xxhdpi 對應的 density 為480,targetDensity 對應三星s6的密度為640,所以:
522/480 * 640 * 686/480 *640 * 4 = 2546432B,和上面的實際情況是不一樣,有誤差的,誤差哪裡來的?接著往下看!

哪裡有誤差,追蹤源碼,源碼給出的計算方法如下:
在我們的例子中,
scaledWidth = int( 522 * 640 / 480f + 0.5) = int(696.5) = 696
scaledHeight = int( 686 * 640 / 480f + 0.5) = int(915.16666…) = 915
然後
915 * 696 * 4 = 2547360。這下就對了!

所以,在你的APP適配屏幕的時候,一定要多做幾套圖。不要覺得好像在drawable-xxhdpi放一套圖我的app運行起來好像也沒有問題啊,實則不然。適用於ppi為640的圖你放到ppi為320的設備中顯示的話,內存會是4倍。(後面這兩句話不對)

實例分析:

lhdpi:120 mhdpi:160 hdpi:240 xhdpi:320 xxhdpi:480 xxxhdpi:640
如果我的app中有一個imageview,寬和高為100*100,那麼在適配S6(ppi為640)我在xxxhdpi中放了一個100*100的圖片,那麼此圖在S6的這個imageview中占內存為 ( 100 * 640 / 640 + 0.5)*( 100 * 640 / 640 + 0.5)*4也就是40401B(精確值,按照源碼中的方法算出來的)。
如果我在xxxhdpi中沒存放圖片,只在xhdpi中放了個100*100的圖片,那麼這個app中的這個imageview會佔多少內存呢?計算如下:
(100*640/320 + 0.5)*(100*640/320 + 0.5) *4= 160801B(精確值,按照源碼中的方法算出來的), 約4倍於直接把此圖放在與設備dpi(S6的dpi為640)相近的資源文件夾xxxhdpi中。
為什麼會是四倍呢?因為S6從與它DPI接近的xxxhdpi找不到圖片,然後在xhdpi中找到圖片,因為xhdpi對應的dpi是320,而xxxhdpi對應的dpi是640,我把你320的圖片拿過來當做640的用,肯定要對你進行放大,寬和高分別放大(640/320 = 2)倍,所以佔用內存就是4倍了。如果在xhdpi也沒找到,而只在mhdpi中找到,那麼就要把寬和高分別放大(640/160 = 4)倍了,那麼佔用內存就不是4倍,而是16倍了。

上面說的是設備DPI高於圖片所存放的文件夾的dpi的情況:系統把圖片拿過來用時會自動把圖片放大,所以內存佔用也是原來的數倍甚至是多倍。
如果我的設備dpi小於圖片所在的文件夾的dpi,那麼系統把圖片拿過來用時會不會自動把圖片縮小呢?確實是這樣的!
如果適配時我只在xxxhdpi:640放置了圖片100*100,而我的設備是320的,那麼設備在對應的xhdpi:320找不到圖片就會去xxxhdpi:640文件夾中尋找,那麼在我的設備中,此圖片佔多少內存呢?計算如下:
(100*320/640 + 0.5)*(100*320/640 + 0.5) *4 = 2550B。

所以我們UI給圖的時候,"就目前來講,最佳放置圖片資源的文件夾是drawable-xxhdpi"。為什麼呢?
比方說我在我的代碼中固定一個imageview的寬高是100*100DP,那麼在mhdpi:160放的圖片就必須是100*100,hdpi:240是150*150, xhdpi:320是200*200, xxhdpi:480存放的是300*300, xxxhdpi:640是400*400。這樣的話,在不同的手機上,這個imageview看起來是差不多大的。
但是現實情況是UI不會做這么多圖的,他們只會給出一套圖,那我們要低密度的圖還是高密度的圖呢?肯定是要相對來說密度較高的圖。
比方說UI給我們的只有300*300的,我們把它放在xxhdpi下,但是我的設備dpi是158(接近160),因為只有這一套圖,那麼系統會去xxhdpi取圖,但是取過來之後,會進行相應的縮小,怎麼縮小?寬高分別縮小(xxhdpi/mhdpi,也就是480/160)3倍,那麼300*300縮小為100*100了,剛好在我的160的設備上用。不浪費也不會顯得很模糊。

還是總結一下:
1.圖片佔用多大內存?和設備DPI以及圖片所在文件夾對應的dpi有關,因為計算公式:
(設備DPI / 圖片所在文件夾所對應的dpi * 圖片寬度 + 0.5)*(設備DPI / 圖片所在文件夾所對應的dpi * 圖片高度 + 0.5)*圖片每個像素佔用的位元組數(ARGB_8888佔4個)
2.圖片放大或者縮小多少倍?和設備DPI所對應的文件夾的dpi以及圖片所在的文件夾所對應的dpi有關:
比方我設備dpi是620,「設備DPI所對應的文件夾的dpi」是640,而圖片存在於 xhdpi:320 ,那麼圖片寬高分別放大兩倍。
比方我的設備dpi144,「設備DPI所對應的文件夾的dpi」就是160,而圖片存在於 xxhdpi:480,那麼圖片寬高分別縮小 3倍。

H. Bitmap 究竟佔多大內存

最近在做一款塔防游戲,用的事surfaceview框架,由於圖片過多,而且游戲過程中都需要這些圖片,所以載入成bitmap後造成OOM(outofmemory)異常。下面是我一步一步找解決此問題的紀錄,再此分享,希望對以後出現此問題的開發者有所幫助。第一:出現問題,我的測試手機是2。2android操作系統,不會出現oom問題,但是在老闆的android4.2上卻出現了問題,因為是oom,所以我首先想到的是手動改變手機的內存大小限制。網上有些帖子說可以通過函數設置應用的HEAPSIZE來解決這個問題,其實是不對的。VMRuntime.getRuntime().setMinimumHeapSize(NewSize);堆(HEAP)是VM中佔用內存最多的部分,通常是動態分配的。堆的大小不是一成不變的,通常有一個分配機制來控制它的大小。比如初始的HEAP是4M大,當4M的空間被佔用超過75%的時候,重新分配堆為8M大;當8M被佔用超過75%,分配堆為16M大。倒過來,當16M的堆利用不足30%的時候,縮減它的大小為8M大。重新設置堆的大小,尤其是壓縮,一般會涉及到內存的拷貝,所以變更堆的大小對效率有不良影響。MaxHeapSize,是堆內存的上限值,Android的預設值是16M(某些機型是24M),對於普通應用這是不能改的。函數setMinimumHeapSize其實只是改變了堆的下限值,它可以防止過於頻繁的堆內存分配,當設置最小堆內存大小超過上限值時仍然採用堆的上限值,對於內存不足沒什麼作用。setTargetHeapUtilization(floatnewTarget)可以設定內存利用率的百分比,當實際的利用率偏離這個百分比的時候,虛擬機會在GC的時候調整堆內存大小,讓實際佔用率向個百分比靠攏。在手機上進行了多次測試,確實不好使,在此,我斷了改變內存限制的方法。第二:查找出現問題的原因。1,在網上搜索bitmap內存溢出,找到很多說是因為圖片大小引起的此問題。觀察我的資源文件,沒有太大的圖片,只是圖片數量過多,有將近900張,分別找出一張最大的圖片和幾張比較大的圖片,單獨測試,沒有發現問題。方法1排除。2,既然圖片數量過多,突破點可能就是圖片數量問題。於是分別找了200,400,600圖片進行測試,在500左右的時候遇到錯誤,通過寶哥知道了將小圖片整合存放到一張大圖的方法,以此來減少圖片的數量,但是仔細想想,載入成bitmap的時候還是要切割成小圖生成bitmap,所以對此方法表示懷疑。由於以前沒用過此方法,試試也無妨。所用到的工具是gdx—texturepackger,它只是一個工具,這里就不多說了。測試的最終結果是還是oom。方法2排除。3,現在看來,既然不是圖片數量的問題,而且會在500張左右的時候報錯,那就可能是佔用內存大小的問題了,Android手機有內存限制,但是我的圖片大小又大於這個限制,這讓我頭疼了很長時間,研究國外的一些文章,從中發現了一些有用的信息,這些信息能夠加深你對Android的解析bitmap機制的理解,在此分享:.作為蜂窩點陣圖數據是在VM分配堆。)(whichissmall),ibrary.有一個引用在VM堆(小),但實際的數據是在本機堆分配由底層Skia圖形庫。Unfortunately,.decode…(),theSkiaimplementation()logsthemessageyou』reseeing(「VMwon』tletusallocatexxxxbytes」)「bitmapsizeexceedsVMbudget」.不幸的是,雖然BitmapFactory.decode的定義…()表示,它返回null如果圖像數據不能解碼,Skia實現(或者說JNI膠之間的Java代碼和Skia)日誌消息你看到(「VM不會讓我們分配xxxx位元組」),然後拋出一個OutOfMemory異常與誤導信息」點陣圖的大小超過VM預算」。.這個問題不是在VM堆而是在本機堆。TheNatï,bitmapusage.本機堆是正在運行的應用程序之間共享,因此空閑空間的大小取決於其他運行程序,他們使用的點陣圖。However,()andgetNativeHeapSize()arenotreliable.然而,我發現getNativeHeapFreeSize()和getNativeHeapSize()是不可靠的。.本機堆大小不同的平台。Soatstartup,apsize.所以在啟動時,我們檢查最大允許VM堆大小來確定最大允許本機堆大小。「」—「點陣圖數據不是在VM分配堆」——這是VM分配的堆在蜂窩Yes.是的。AsofHoneycomb(v3.0),.作為蜂窩(v3.0),點陣圖數據堆上分配VM。(v2.3.x)andbefore所以所有上述只適用於姜餅(v23x)和之前這些信息零零散散,但是不難發現,問題的原因就在於根據Android版本的不同,bitmapdata存放的位置是不同的,3.0以前是分配在nativeheap上,3.0以後是分配在VMheap上。

I. bitmap的怎麼獲取大小

首先
bitmap在內存里是未壓縮的
存儲每個像素然後
你到底要的是bitmap的大小還是圖片文件的大小
查看原帖>>

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

閱讀全文

與bitmap文件大小相關的資料

熱點內容
有什麼電影露奶子 瀏覽:907
S7edge支持微信指紋么 瀏覽:83
win10跨平台 瀏覽:343
qq暴走gif動態圖片製作 瀏覽:340
iphone5連不上網路數據 瀏覽:229
佛教電影大全佛片 瀏覽:191
如何還原回收站的文件 瀏覽:850
洛陽大數據產業園區 瀏覽:900
伺服器資料庫在哪裡 瀏覽:769
割奶電影免推薦 瀏覽:376
數控刀架怎麼編程讓它一直轉 瀏覽:311
app創意名字大全 瀏覽:186
黑太陽731小啞巴扮演者 瀏覽:485
寧夏中考成績查詢網站是多少 瀏覽:786
主角把自己媽媽和姐姐收了 瀏覽:521
taz是什麼網站 瀏覽:479
怎麼登陸網站伺服器 瀏覽:957
可以看網站 瀏覽:833
天長華意影院今日影訊 瀏覽:224
稀奇電影 瀏覽:616

友情鏈接