Bitmap在Android中指的的是一张图片,比如png、jpg等图片,通过BitmapFactory类的decodeFile、decodeResource、decodeStream和decodeByteArray方法可以分别从文件系统、资源、输入流、字节数组中加载出一个Bitmap对象,其中decodeFile和decodeResource是调用decodeStream实现的
通过BitmapFactory.Options来缩放图片
采样率inSampleSize,它的值代表边的缩放率,比如说2,代表边缩放1/2,则像素为原图的1/4,占用的内存也为原图的1/4,所以,通过设置BitmapFactory的采样率可以减少图片的所需内存,达到高效加载
使用流程:
1. 创建BitmapFactory.Options,并设置它的inJustDecodeBounds为true,表示只加载图片的宽高属性
2. 用这个BitmapFactory和Options去加载图片的宽高属性,会储存在Options里
3. 从Options中取出图片的宽高属性,它对应于outWidth/Height
4. 设定采样规则,根据采样规则来结合所需的图片大小计算出采样率inSampleSize,储存在Options里
5. 将Options的inJustDecodeBounds为false,表示要正常加载图片
6. 用BitmapFactory和储存有inSampleSize的Options去加载图片
代码如下:
public static Bitmap decodeBitmapFromResource(Resources res, int resID, int reqWidth, int reqHeight) {
//创建位图工厂的配置类
final BitmapFactory.Options options = new BitmapFactory.Options();
//设置配置:只加载位图的大小
options.inJustDecodeBounds = true;
//让工厂带着这样的配置去加载图片
BitmapFactory.decodeResource(res, resID, options);
//根据加载到的大小去计算配置里应该配置的采样率
options.inSampleSize = computeInSampleSize(options, reqWidth, reqHeight);
//设置配置:关闭只加载位图的大小
options.inJustDecodeBounds = false;
//让工厂带着修改后的配置重新加载图片
return BitmapFactory.decodeResource(res, resID, options);
}
public static int computeInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
//获得配置的外部属性,也就是图片的原始大小
final int oldWidth = options.outWidth;
final int oldHeight = options.outHeight;
//初始化采样率为1,先从原图和需求的大小开始比较
int inSampleSize = 1;
int inSampleSizeW = oldWidth / reqWidth;
int inSampleSizeH = oldHeight / reqHeight;
if (inSampleSizeW > inSampleSizeH) {
inSampleSize = inSampleSizeW;
} else {
inSampleSize = inSampleSizeH;
}
//得到最终的采样率
return inSampleSize;
}
剪裁方法(需要先获得Bitmap,所以并不是高效加载):
实现的思想就是使用Bitmap去创建新的Bitmap,具体一点就是通过目标宽高和原宽高的比例来创建一个矩阵,然后用矩阵来创建新的Bitmap
代码如下:
public static Bitmap ScaleBitmap(Bitmap bm, int reqWidth, int reqHeight) {
// 得到图片原始的高宽
int rawHeight = bm.getHeight();
int rawWidth = bm.getWidth();
// 设定图片新的高宽
int newHeight = reqHeight;
int newWidth = reqWidth;
// 计算缩放因子
float heightScale = ((float) newHeight) / rawHeight;
float widthScale = ((float) newWidth) / rawWidth;
// 新建立矩阵
Matrix matrix = new Matrix();
matrix.postScale(heightScale, widthScale);
//将图片大小压缩
//压缩后图片的宽和高以及kB大小均会变化
Bitmap newBitmap = Bitmap.createBitmap(bm, 0, 0, rawWidth, rawHeight, matrix, true);
return newBitmap;
}