1 /**
2 * 获取压缩后的图片 (官网大图片加载对应代码)
3 *
4 * @param res
5 * @param resId
6 * @param reqWidth
7 * 所需图片压缩尺寸最小宽度
8 * @param reqHeight
9 * 所需图片压缩尺寸最小高度
10 * @return
11 */
12 public static Bitmap decodeSampledBitmapFromResource(Resources res,
13 int resId, int reqWidth, int reqHeight) {
14
15 // 首先不加载图片,仅获取图片尺寸
16 final BitmapFactory.Options options = new BitmapFactory.Options();
17 // 当inJustDecodeBounds设为true时,不会加载图片仅获取图片尺寸信息
18 options.inJustDecodeBounds = true;
19 // 此时仅会将图片信息会保存至options对象内,decode方法不会返回bitmap对象
20 BitmapFactory.decodeResource(res, resId, options);
21
22 // 计算压缩比例,如inSampleSize=4时,图片会压缩成原图的1/4
23 options.inSampleSize = calculateInSampleSize(options, reqWidth,
24 reqHeight);
25
26 // 当inJustDecodeBounds设为false时,BitmapFactory.decode...就会返回图片对象了
27 options.inJustDecodeBounds = false;
28 // 利用计算的比例值获取压缩后的图片对象
29 return BitmapFactory.decodeResource(res, resId, options);
30 }
31
32 /**
33 * 计算压缩比例值 (官网大图片加载对应代码)
34 *
35 * @param options
36 * 解析图片的配置信息
37 * @param reqWidth
38 * 所需图片压缩尺寸最小宽度
39 * @param reqHeight
40 * 所需图片压缩尺寸最小高度
41 * @return
42 */
43 public static int calculateInSampleSize(BitmapFactory.Options options,
44 int reqWidth, int reqHeight) {
45 // 保存图片原宽高值
46 final int height = options.outHeight;
47 final int width = options.outWidth;
48 // 初始化压缩比例为1
49 int inSampleSize = 1;
50
51 // 当图片宽高值任何一个大于所需压缩图片宽高值时,进入循环计算系统
52 if (height > reqHeight || width > reqWidth) {
53
54 final int halfHeight = height / 2;
55 final int halfWidth = width / 2;
56
57 // 压缩比例值每次循环两倍增加,
58 // 直到原图宽高值的一半除以压缩值后都~大于所需宽高值为止
59 while ((halfHeight / inSampleSize) >= reqHeight
60 && (halfWidth / inSampleSize) >= reqWidth) {
61 inSampleSize *= 2;
62 }
63 }
64 return inSampleSize;
65 }