1. 程式人生 > >關於設定圖片時,記憶體溢位的解決方法

關於設定圖片時,記憶體溢位的解決方法

不知道大家在使用ImageView的setImageBitmap方法時,有沒有遇到過一旦給ImageView設定比較大的圖片,就會導致記憶體溢位這樣的問題。希望我所用的方法在一定程度上可以幫助大家~~

廢話不多說,開始搞事情~~

/** 
 * 通過圖片路徑讀取圖片並通過對圖片進行處理,從而減小圖片的記憶體體積,避免記憶體溢位 
 * @param imgpath 需要處理的圖片路徑 
 * @param w 欲設定的寬度 
 * @param h 欲設定的高度             
 */  
public static Bitmap loadBitmap(String imgpath, int w, int h) {  
          
        BitmapFactory.Options opts = new BitmapFactory.Options();  
          
        //將option的injustDecodeBounds設為true時,解碼bitmap時可以只返回它的寬、高和MIME型別,而不必為其申請記憶體,從而節省了記憶體空間。  
        opts.inJustDecodeBounds = true;  
  
        BitmapFactory.decodeFile(imgpath, opts);  
          
        //獲取原圖片的寬  
        int srcWidth = opts.outWidth;  
        //獲取原圖片的高  
        int srcHeight = opts.outHeight;  
		
        int destWidth = 0;  
        int destHeight = 0;  
        //縮放比例  
        double ratio = 0.0;  
          
        //原圖的寬高其中一個小於預設值時,則選用原圖的寬高  
        if (srcWidth < w || srcHeight < h) {  
            ratio = 0.0;  
            destWidth = srcWidth;  
            destHeight = srcHeight;  
        } else if (srcWidth > srcHeight) {  
        //原圖的寬高都大於預設的寬高且寬的值比高的值要大,則選用寬的縮放比率
            ratio = (double) srcWidth / w;  
            destWidth = w;  
            destHeight = (int) (srcHeight / ratio);  
        } else {
		//原圖的寬高都大於預設的寬高且高的值比寬的值要大,則選用高的縮放比率
            ratio = (double) srcHeight / h;  
            destHeight = h;  
            destWidth = (int) (srcWidth / ratio);  
        }  
        //建立一個新的Options  
        BitmapFactory.Options newOpts = new BitmapFactory.Options();  
        
	//對圖片的取樣點進行隔行抽取,以減少圖片的記憶體
	newOpts.inSampleSize = (int) ratio + 1;  
        
	newOpts.inJustDecodeBounds = false;  
        newOpts.outHeight = destHeight;  
        newOpts.outWidth = destWidth;  
        通過新的配置好的options進行圖片的解析  
        Bitmap tempBitmap = BitmapFactory.decodeFile(imgpath, newOpts);  
        return tempBitmap;  
    }  

在此,對於inSampleSize進行說明一下:

對大圖進行降取樣,以減小記憶體佔用。因為直接從點陣中隔行抽取最有效率,所以為了兼顧效率, inSampleSize 這個屬性只認2的整數倍為有效.
比如你將 inSampleSize 賦值為2,那就是每隔2行採1行,每隔2列採一列,那你解析出的圖片就是原圖大小的1/4.
這個值也可以填寫非2的倍數,非2的倍數會被四捨五入.