1. 程式人生 > >Android利用縮放載入大圖片避免記憶體溢位

Android利用縮放載入大圖片避免記憶體溢位

因為安卓的堆記憶體有限(儘管現在隨著安卓手機螢幕解析度的提高堆記憶體沒有以前小螢幕時代那麼侷限),要是完全載入一張大圖片很容易導致OOM(out of memory)的問題。

所以為了解決這一情況,我們可以通過縮放這一個方法來載入圖片。

首先我們介紹今天要用到的API:BitmapFactory.Options

我們先上程式碼:

<span style="font-family:Microsoft YaHei;">//解析圖片時需要使用到的引數封裝在opt這個物件裡
Options opt = new Options();
//不用為畫素申請記憶體,只獲取圖片的寬高
opt.inJustDecodeBounds = ture;
BitmapFactory.decodeFile("sdcard/xx.jpg",opt);</span>

現在出現了一個新的東東,我們看一下API文件咋說。
If  set to true,the  decoder will return null(no bitmap),but the out... fields will still be st,allowing the caller to query the bitmap without having to allocate the memory for pixels.

意思是說,要是我們將opt.inJustDecodeBounds設為ture,這個解析器就不會返回圖片,它只會返回圖片的一些資訊。這樣子就可以使呼叫者可以請求圖片,卻不用分配記憶體

現在我們理清一下縮放圖片的步驟:

1.用Options.inJustDecodeBounds來獲取大圖片的寬高
2.獲取手機螢幕的解析度
3.通過圖片寬高與手機螢幕寬高得到一個縮放圖片的比例
  譬如:手機螢幕解析度為1920x1080                
        大圖片解析度為5184x3456              
        5184/1920=2           
        3456/1080=3
(通常我們取整數作為縮放比例,然後為了最大程度避免OOM情況我們會選擇一個較大的縮放比例,這裡我們選擇3,還要確保比例大於等於1)
4.設定縮放比例
5.把inJustDecodeBounds設為false(要是不設為false會出現圖片不能解析,因為只會解析邊界
6.Bitmap bm = BitmapFactory.decodeFile("sdcard/xx.jpg",opt) 解析縮放後的圖片


好,我們現在上完整程式碼:
 public void click(View v){
    	//解析圖片時的引數封裝到這個物件裡面
    	Options opt = new Options();
    	//只解析大圖片的寬高資訊,不用耗費記憶體解析圖片畫素
    	opt.inJustDecodeBounds = true;
        //傳入一個opt物件 
    	BitmapFactory.decodeFile("sdcard/xx.jpg", opt);
    	//拿到大圖片的寬高
    	int imageWidth = opt.outWidth;
    	int imageHeight = opt.outHeight;
    	
    	Display dp = getWindowManager().getDefaultDisplay();
    	//獲取螢幕寬高
    	int screenWidth = dp.getWidth();
    	int screenHeight = dp.getHeight();
    	
    	//計算縮放比例
    	int scale = 1;
    	int scaleWidth = imageWidth / screenWidth;
    	int scaleHeight = imageHeight / screenHeight;
    	if(scaleHeight >= scaleWidth && scaleHeight >=1){
    		scale = scaleHeight;
    	}
    	else if(scaleWidth >= scaleHeight && scaleWidth >= 1){
    		scale = scaleWidth;
    	}
    	
    	//設定縮放比例
    	opt.inSampleSize = scale;
    	opt.inJustDecodeBounds = false;
    	Bitmap bm = BitmapFactory.decodeFile("sdcard/xx.jpg", opt);
    	
    	ImageView iv = (ImageView)findViewById(R.id.iv);
    	iv.setImageBitmap(bm);
    	
    	
    }


還需注意的是,在dp.getWidth()與dp.getHeight()兩個方法雖然顯示已經過時,但是由於谷歌推薦的dp.getSize()只支援API leve 13的系統所以,由於載入圖片為一項基礎需求,所以需要支援低版本,我們還是繼續用前兩個方法。

相關推薦

Android利用載入圖片避免記憶體溢位

因為安卓的堆記憶體有限(儘管現在隨著安卓手機螢幕解析度的提高堆記憶體沒有以前小螢幕時代那麼侷限),要是完全載入一張大圖片很容易導致OOM(out of memory)的問題。 所以為了解決這一情況,我

載入圖片記憶體的合理方法

圖形影象處理 先明確幾個概念。 1.關於單位:計算機中最小單位是位元bit,即一個0或者一個1,計 算機儲存檔案是以byte為單位,byte是位元組等於8個位元。 1M=1024kb;1kb=1024byte;1byte=8bit; 2.計算機如何表示圖形:以畫素為單位,組

android 本地圖片造成記憶體溢位的解決方案

在使用中,小的圖片,可以通過drawable直接引用setImageResource或者setBackgroundResource, 但涉及到大圖時,儘量通過decodeStream來建立bitmap,然後再給對應的view使用。 public static Bitmap readBitMap(

圖片載入本地圖片出現記憶體溢位

public static Bitmap readBitMap(Context context, int resId) { BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferr

cocos2dx,精靈載入圖片之後,利用改變精靈大小

根據圖片建立一個精靈: auto sprite_back = Sprite::create("login_background.png"); 載入了圖片的精靈直接呼叫方法setContentSize() 不起作用,圖片還是該多大多大。 那麼實際上能夠稱該改變大小的就只有

Android 手勢檢測實戰 打造支援平移的圖片預覽效果(上)

                轉載請標明出處:http://blog.csdn.net/lmj623565791/article/details/39474553,本文出自:【張鴻洋的部落格】1、背景現在app中,圖片預覽功能肯定是少不了的,使用者基本已經形成條件反射,看到小圖,點選看大圖,看到大圖兩個手指

Android-載入圖片

在開發之中會遇到,載入小圖片沒問題,當載入大圖片的時候,記憶體溢位,為了解決這個問題,Android是提供了API 來處理優化圖片的方式解決,就是計算螢幕寬高 和 圖片寬高 的縮放比例,進行縮放,這樣就不會報記憶體溢位錯誤來    activity_image.xml 佈局檔案:

安卓基礎之載入本地

1.獲取手機螢幕解析度 WindowManager wm= (WindowManager)getSystemService(WINDOW_SERVICE); int height=wm.getDefaultDisplay().getHeight(); int widt

Android 手勢檢測實戰 打造支援平移的圖片預覽效果(下)

上一篇已經帶大家實現了自由的放大縮小圖片,簡單介紹了下Matrix;具體請參考:Android 手勢檢測實戰 打造支援縮放平移的圖片預覽效果(上);本篇繼續完善我們的ImageView~~首先加入放大後的移動~~1、自由的進行移動我們在onTouchEvent裡面,加上移動的

Android圖片的方法

簡介 在Android專案中常常需要調整原始圖片的尺寸大小以適應儲存、傳輸和圖片處理等需求。在Android API中提供了一些縮放圖片的方法,在專案中發現,使用Android API中的Canvas、BitmapFactory和ThumbnailUtils等

android 手勢圖片框架

//圖片手勢放大 第一個ImageViewTouch 只支援圖片放大和縮小位置不會變動 compile 'it.sephiroth.android.library.imagezoom:imagezoom:+' 第二個PhotoView 可以拖動

Android(decode檔案轉成bitmap)使用BitmapFactory.Options解決載入圖片記憶體溢位

由於Android對圖片使用記憶體有限制,若是載入幾兆的大圖片便記憶體溢位。Bitmap會將圖片的所有畫素(即長x寬)載入到記憶體中,如果圖片解析度過大,會直接導致記憶體溢位(java.lang.OutOfMemoryError),只有在BitmapFactory載入

Android Bitmap載入圖片

在相機拍攝畫素越來越高的現在,高解析度的大圖已經很常見,手機載入高清大圖功能基本已成日常需要。但是,由於移動裝置本身記憶體和解析度的限制,通常會先載入縮圖然後根據需要展示大圖內容。 一、載入縮圖 1.讀取圖片大小和型別 BitmapFactory

Android使用BitmapFactory.Options壓縮圖片解決載入圖片記憶體溢位

由於Android對圖片使用記憶體有限制,若是載入幾兆的大圖片便記憶體溢位。Bitmap會將圖片的所有畫素(即長x寬)載入到記憶體中,如果圖片解析度過大,會直接導致記憶體溢位(java.lang.OutOfMemoryError),只有在BitmapFactory載入圖片時使

php實現等比例不失真上傳圖片的方法

jpeg || 占用空間 pos width 參考 idt brush 上傳圖片 本文實例分析了php實現等比例不失真縮放上傳圖片的方法。分享給大家供大家參考,具體如下: 有時上傳圖片時因為圖片太大了,不僅占用空間,消耗流量,而且影響瀏(圖片的尺寸大小不一)。下面分享一種等

Android之Volley框架載入網路圖片

更多幹貨 分散式實戰(乾貨) spring cloud 實戰(乾貨) mybatis 實戰(乾貨) spring boot 實戰(乾貨) React 入門實戰(乾貨) 構建中小型網際網路企業架構(乾貨) python 學習持續更

android-Picasso請求https載入網路圖片不能顯示的解決方案

Picasso載入https的圖片載入不出來的解決方案 最近專案中有需求–要顯示https連結的圖片,但是配置好路徑後原生的Picasso死活沒法加載出圖片,最後在網上找到了如下的解決辦法 確認依賴 compile 'com.squareup.ok

BitmapFactory --- 手動載入圖片Demo

  【1】問題加在過大的圖片,記憶體分配給的不夠就會報錯 10-16 02:11:10.443: I/dalvikvm-heap(22693): Forcing collection of SoftReferences for 30720012-byte allocation

自定義ImageView: 實現自由 ,自由移動後的圖片 .雙擊放大與縮小圖片 相容ViewPager

直接擼程式碼, 複製就能用 package com.zhf.baselibrary.view; import android.annotation.SuppressLint; import android.content.Context; import android.graphi

Fresco 在Android 4.4 版本 載入https圖片問題 javax.net.ssl.SSLHandshakeException

由於Android系統的不同版本支援的TLS 版本不同,導致Fresco 載入https圖片(圖片來源於不同伺服器,並且配置不一樣)出現SSLHandshakeException TLS 用於在兩個通訊應用程式之間提供保密性和資料完整性。TLS 1.0可以理解成