1. 程式人生 > >Android 圖片縮放 BitmapFactory詳解

Android 圖片縮放 BitmapFactory詳解

 
在把圖片轉化為bitmap時,遇到大一些的圖片,我們經常會遇到OOM(Out Of Memory)的問題。因此需要把圖片進行縮放。

Options

這就用到了我們上面提到的BitmapFactory.Options這個類,下面逐一介紹Options的引數

Options.inJustDecodeBounds

BitmapFactory.Options這個類,有一個欄位叫做 inJustDecodeBounds ,如果我們把它設為true,那麼BitmapFactory.decodeFile(String path, Options opt)並不會真的返回一個Bitmap給你,它僅僅會把它的寬,高取回來給你,這樣就不會佔用太多的記憶體,也就不會那麼頻繁的發生OOM了。
 
 如果我們把它設為true,那麼BitmapFactory.decodeFile(String path, Options opt)並不會真的返回一個Bitmap給你,它僅僅會把它的寬,高取回來給你,這樣就不會佔用太多的記憶體,也就不會那麼頻繁的發生OOM了。
 

BitmapFactory.Options options = new BitmapFactory.Options();  

options.inJustDecodeBounds = true;  

Bitmap bmp = BitmapFactory.decodeFile(path, options);/* 這裡返回的bmp是null */  

之後,options.outWidth 和 options.outHeight就是我們想要的寬和高了。可以根據需要進行圖片的縮略,在文章最後附上圖片縮放程式碼

Options.inSampleSize

圖片的縮放比例,該引數需要自己通過計算得到,一般通過options.outHeight和 options. outWidth獲取的寬高和自己想要到得圖片寬高計算出縮放比例。下面會給出縮放程式碼

為了節約記憶體我們還可以使用下面的幾個欄位:

options.inDither=false;    /*不進行圖片抖動處理*/  
options.inPreferredConfig=null;  /*設定讓解碼器以最佳方式解碼*/  

/* 下面兩個欄位需要組合使用 */  

options.inPurgeable = true;  

options.inInputShareable = true;  

BitmapFactory的一些方法

這些方法可以用於從不同的資料來源解析、建立Bitmap物件

  1. BitmapFactory.decodeByteArray(byte[] data, int offset, int length)
    從指定位元組陣列的offset位置開始,將長度為length的位元組資料解析成Bitmap物件

  2. BitmapFactory.decodeFile(String path)
       該方法將指定路徑的圖片轉成Bitmap,
     

  3. BitmapFactory.decodeFile(String path, Options options)
       該方法使用options的變數資訊,將指定路徑的圖片轉成Bitmap

  4. decodeResource()
      可以將/res/drawable/內預先存入的圖片轉換成Bitmap物件

    1. decodeStream()
        方法可以將InputStream物件轉換成Bitmap物件。

圖片縮放程式碼:

private Bitmap decodeThumbBitmapForFile(String path, int viewWidth, int viewHeight){
        BitmapFactory.Options options = new BitmapFactory.Options();
        //設定為true,表示解析Bitmap物件,該物件不佔記憶體
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, options);
        //設定縮放比例
        options.inSampleSize = computeScale(options, viewWidth, viewHeight);

        //設定為false,解析Bitmap物件加入到記憶體中
        options.inJustDecodeBounds = false;
        Log.e(TAG, "get Iamge form file,  path = " + path);
        //返回Bitmap物件
        return BitmapFactory.decodeFile(path, options);
    }

computeScale() 計算縮放比例:

private int computeScale(BitmapFactory.Options options, int viewWidth, int viewHeight){
        int inSampleSize = 1;
        if(viewWidth == 0 || viewWidth == 0){
            return inSampleSize;
        }
        int bitmapWidth = options.outWidth;
        int bitmapHeight = options.outHeight;

       //假如Bitmap的寬度或高度大於我們設定圖片的View的寬高,則計算縮放比例
        if(bitmapWidth > viewWidth || bitmapHeight > viewWidth){
            int widthScale = Math.round((float) bitmapWidth / (float) viewWidth);
            int heightScale = Math.round((float) bitmapHeight / (float) viewWidth);

        //為了保證圖片不縮放變形,我們取寬高比例最小的那個
            inSampleSize = widthScale < heightScale ? widthScale : heightScale;
        }
        return inSampleSize;
    }