1.讀取圖片信息(寬今缚、高秋秤、MimeType)
BitmapFactory.Options options = new BitmapFactory.Options();//options對象用來存放圖片的信息
options.inJustDecodeBounds = true;//true表示返回一個為null的Bitmap,這樣不占用內(nèi)存
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);//把圖片信息寫入options對象
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;
當(dāng)然以下靜態(tài)方法也是可以獲得options對象的
BitmapFactory.decodeFile(String pathName, Options opts);
BitmapFactory.decodeByteArray(byte[] data, int offset, int length, Options opts);
BitmapFactory.decodeStream(InputStream is, Rect outPadding, Options opts);
2.計算縮放大小
為了告訴解碼器去加載一個縮小版本的圖片到內(nèi)存中,需要在BitmapFactory.Options 中設(shè)置 inSampleSize 的值预明。例如, 一個分辨率為2048x1536的圖片役耕,如果設(shè)置 inSampleSize 為4采转,那么會產(chǎn)出一個大約512x384大小的Bitmap。加載這張縮小的圖片僅僅使用大概0.75MB的內(nèi)存瞬痘,如果是加載完整尺寸的圖片故慈,那么大概需要花費12MB(前提都是Bitmap的配置是 ARGB_8888)。下面有一段根據(jù)目標(biāo)圖片大小來計算Sample圖片大小的代碼示例:
public static int calculateInSampleSize( BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
為了使用該方法框全,首先需要設(shè)置 inJustDecodeBounds 為 true
, 把options的值傳遞過來察绷,然后設(shè)置inSampleSize 的值并設(shè)置 inJustDecodeBounds 為 false
,之后重新調(diào)用相關(guān)的解碼方法津辩。
3.解碼克婶,返回縮小的Bitmap
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) {
// 第一次設(shè)置 inJustDecodeBounds=true 只是計算尺寸
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// 計算 inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}