对图片进行二次采样的时候计算压缩之后的尺寸
/**
* 官方计算代码
* 根据用户所给出的宽度和高度计算出来压缩比例
* @param options
* @param reqWidth
* @param reqHeight
* @return
*/
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 (reqWidth > 0 && reqHeight > 0) {
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;
}
生成图片:
//按照原始的图片的尺寸 进行Bitmap的生成
//bitmap生成的时候是按照图片的原始的宽高进行生成,并且每一个像素占用四个字节也就是ARGB
//ret = BitmapFactory.decodeByteArray(data,0,data.length);
//采用二次采样也就是缩小图片尺寸的方法
//步骤1:获取原始图片的宽、高的信息只用于采样的计算
//1.1: 创建Options给BitMapFactiry内部解码器传递参数
BitmapFactory.Options options = new BitmapFactory.Options();
//1.2设置inJuetDecodeBounds 来控制解码器。只进行图片高度和宽度的获取不会加载Bitmap
//不占用内存,当时用这个参数,代表BitmapFactory.decodeXxx类似的方法,不会返回Bitmap
options.inJustDecodeBounds = true;
//解码的时候使用Options参数设置解码的方式
BitmapFactory.decodeByteArray(data, 0, data.length, options);
//--------------------------------------------------------------------------------
//2:根据图片的真实的尺寸,和当前需要显示的尺寸,进行计算,生成图片的采样率。
//2.2 准备显示在手机上的尺寸
//尺寸是根据程序需要设置的。
int size = calculateInSampleSize(options, requestWidth, requestHeight);
//2.3 计算和设置采样率
options.inSampleSize = size;//宽度的1/32 高度的1/32
//2.4开放 解码,实际生成Bitmap
options.inJustDecodeBounds = false;
//2.4.1
//要求对每一个采样的像素使用RGB_565存储方式
//一个像素占用两个字节比 ARGB_8888小了一半
//如果解码器不能使用指定的配置那么自动使用 ARGB_8888
options.inPreferredConfig = Bitmap.Config.RGB_565;
//2.5使用设置的采样参数进行解码
ret = BitmapFactory.decodeByteArray(data, 0, data.length, options);