BitmapFactory提供了四类方法:decodeFile、decodeResource、decodeStream、decodeByteArray
1、从文件中读取
try {
FileInputStream in = new FileInputStream("/sdcard/Download/xx.png");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Bitmap bitmap = BitmapFactory.decodeStream(in);
// 间接调用 BitmapFactory.decodeStream
Bitmap bm = BitmapFactory.decodeFile(sd_path);
2、从资源中读取
// 间接调用 BitmapFactory.decodeStream
Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.xxx);
- 从字节序列里读取
// InputStream转换成byte[]
Bitmap bm = BitmapFactory.decodeByteArray(myByte,0,myByte.length);
巨图加载:BitmapRegionDecoder,可以按照区域进行加载
高效加载:核心其实也很简单,主要是采样压缩、缓存策略、异步加载等
- 采样压缩
BitmapFactory.Options options = new BitmapFactory.Options();
//inJustDecodeBounds为true,不返回bitmap,只返回这个bitmap的尺寸
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), images[position], options);
//利用返回的原图片的宽高,我们就可以计算出缩放比inSampleSize(只能是2的整数次幂)
options.inSampleSize = caluelateInSampleSize(options, reqWidth, reqHeight);//使用RGB_565减少图片大小
options.inPreferredConfig = Bitmap.Config.RGB_565;
//释放内存,共享引用(21版本后失效)
options.inPurgeable = true;
options.inInputShareable = true;
//inJustDecodeBounds为false,返回bitmap
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), images[position], options);
网友评论