一驹碍,Bitmap基本概念:
1.bitmap是Android系統(tǒng)中的圖像處理的重要類之一及塘;
2.通過bitmap我們可以獲取到圖片的相關(guān)信息尤勋;
3.bitmap文件圖像效果好就需要占用越大存儲空間浴栽;
二肚吏,Bitmap的加載方式:
1.BitmapFactory.decodeBetyArray();//字節(jié)數(shù)組
2.BitmapFactory.decodeFile();//文件路徑
3.BitmapFactory.decodeResource();//資源ID
4.BitmapFactory.decodeStream();//流
Bitmap不做處理的加載方式:
Bitmap bitmap = BitmapFactory.decodeResource(getResources,R.drawable.ic_launcher,null);
//最后一個參數(shù)是BitmapFactory.Options,bitmap的高效處理就是通過BitmapFactory.Options來設(shè)置的
三吮蛹,BitmapFactory.Options的作用:
1.防止內(nèi)存溢出荤崇;
2.節(jié)省內(nèi)存開銷;
3.系統(tǒng)更流暢潮针;
四术荤,BitmapFactory.Options的重要屬性:
1.injustDecodeBounds;
*設(shè)為true,那么BitmapFactory并不會真的返回一個Bitmap給你每篷,它僅僅會把它的寬瓣戚,高取回來給你,這樣就不會占用太多的內(nèi)存焦读,也就不會那么頻繁的發(fā)生OOM子库。
*設(shè)置為false,BitmapFactory返回bitmap;
2.outWidth&outHeight;
*bitmap圖像的寬和高矗晃;
3.inSampleSize;
獲取采樣率
*inSampleSize大于1時仑嗅,圖像高刁品、寬分別以2的inSampleSize次方分之一縮小
*inSampleSize小于等于1時痢掠,圖像高九杂、寬不變祷嘶;
4.inpreferredConfig:
*ALPHA_8: 每個像素用占8位,存儲的是圖像的透明值,占1個字節(jié);
*RGB_565:每個像素用占16位,分別為5-R,6-G,5-B通道,占2個字節(jié);
*ARGB-4444:每個像素占16位,即每個通道用4位表示,占2個字節(jié);
*ARGB_8888:每個像素占32位,每個通道用8位表示,占4個字節(jié);
5.inDither:
*是否進行圖像抖動處理;
6.inMutable:
*如果設(shè)置為true,將返回一個mutable的bitmap,可用于修改BitmapFactory加載而來的bitmap.
7.inScale:
*是否需要放縮位圖
BitmapFactory.options的實際應(yīng)用:
String pathName = "/storage/emulated/0/test1.jpg";
//width: 263,ImageView實際比較小
int width = mIv.getWidth();
int height = mIv.getHeight();
Log.d(TAG, "imageView width: "+width);
//不采樣時圖片的大小:9216000
Bitmap bitmap = BitmapFactory.decodeFile(pathName);
Log.d(TAG, "不二次采樣bitmap大小: "+bitmap.getAllocationByteCount());
BitmapFactory.Options options = new BitmapFactory.Options();
//設(shè)置為true,加載圖片時不會獲取到bitmap對象,但是可以拿到圖片的寬高
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(pathName,options);
//計算采樣率,對圖片進行相應(yīng)的縮放
int outWidth = options.outWidth;
int outHeight = options.outHeight;
Log.d(TAG, "outWidth: "+outWidth+",outHeight:"+outHeight);
float widthRatio = outWidth*1.0f/width;
float heightRatio = outHeight*1.0f/height;
Log.d(TAG, "widthRatio: "+widthRatio+",heightRatio:"+heightRatio);
float max = Math.max(widthRatio, heightRatio);
//向上舍入
int inSampleSize = (int) Math.ceil(max);
Log.d(TAG, "inSampleSize: "+inSampleSize);
//改為false,因為要獲取采樣后的圖片了
options.inJustDecodeBounds = false;
options.inSampleSize = inSampleSize;
Bitmap bitmap1 = BitmapFactory.decodeFile(pathName, options);
//采樣后圖片大小:144000,是采樣前圖片的inSampleSize*inSampleSize分之一(1/64)
Log.d(TAG, "二次采樣bitmap大小: "+bitmap1.getAllocationByteCount());
mIv.setImageBitmap(bitmap1);
點個贊再走唄