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物件
BitmapFactory.decodeByteArray(byte[] data, int offset, int length)
從指定位元組陣列的offset位置開始,將長度為length的位元組資料解析成Bitmap物件BitmapFactory.decodeFile(String path)
該方法將指定路徑的圖片轉成Bitmap,
BitmapFactory.decodeFile(String path, Options options)
該方法使用options的變數資訊,將指定路徑的圖片轉成BitmapdecodeResource()
可以將/res/drawable/內預先存入的圖片轉換成Bitmap物件- decodeStream()
方法可以將InputStream物件轉換成Bitmap物件。
- decodeStream()
圖片縮放程式碼:
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;
}