为了节省内存,很多情况下原图片都要经过缩放处理,根据控件的尺寸来处理成对应尺寸的图片,这时使用BitmapFactory创建Bitmap,很多情况下都会使用下面的代码:
| 1 2 3 4 5 6 | BitmapFactory.Options options = newBitmapFactory.Options();options.inJustDecodeBounds =true;BitmapFactory.decodeResource(getResources(), R.id.myimage, options);intimageHeight = options.outHeight;intimageWidth = options.outWidth;String imageType = options.outMimeType; | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | publicstaticintcalculateInSampleSize(            BitmapFactory.Options options,intreqWidth,intreqHeight){    // Raw height and width of image    finalint height = options.outHeight;    finalint width = options.outWidth;    intinSampleSize =1;    if(height > reqHeight || width > reqWidth){        finalint halfHeight = height /2;        finalint 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;        }    }    returninSampleSize;} | 
在decode的时候先设置 options . inJustDecodeBounds = true,获取到图片参数后再设置为false,这就是decode时的技巧,下面就把完整代码贴出来,可以作为工具方法来使用:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | publicstaticBitmap decodeSampledBitmapFromResource(Resources res,intresId,        intreqWidth,intreqHeight){    // First decode with inJustDecodeBounds=true to check dimensions    finalBitmapFactory.Options options =newBitmapFactory.Options();    options.inJustDecodeBounds =true;    BitmapFactory.decodeResource(res, resId, options);    // Calculate inSampleSize    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);    // Decode bitmap with inSampleSize set    options.inJustDecodeBounds =false;    returnBitmapFactory.decodeResource(res, resId, options);} | 
上面的方法来自于google官网,没必要进行修改,这就是程序员的拿来主义吧,关键在于要知道为什么这么写。下面是我自己写的一个方法可以直接拿来当工具用。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | /**     * 对图片进行压缩,主要是为了解决控件显示过大图片占用内存造成OOM问题,一般压缩后的图片大小应该和用来展示它的控件大小相近.     *     * @param context 上下文     * @param resId 图片资源Id     * @param reqWidth 期望压缩的宽度     * @param reqHeight 期望压缩的高度     * @return 压缩后的图片     */    publicstaticBitmap compressBitmapFromResourse(Context context, intresId, intreqWidth, intreqHeight) {        finalBitmapFactory.Options options = newBitmapFactory.Options();        /*         * 第一次解析时,inJustDecodeBounds设置为true,         * 禁止为bitmap分配内存,虽然bitmap返回值为空,但可以获取图片大小         */        options.inJustDecodeBounds = true;        BitmapFactory.decodeResource(context.getResources(), resId, options);        finalintheight = options.outHeight;        finalintwidth = options.outWidth;        intinSampleSize = 1;        if(height > reqHeight || width > reqWidth) {            finalintheightRatio = Math.round((float) height / (float) reqHeight);            finalintwidthRatio = Math.round((float) width / (float) reqWidth);            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;        }        options.inSampleSize = inSampleSize;        // 使用计算得到的inSampleSize值再次解析图片        options.inJustDecodeBounds = false;        returnBitmapFactory.decodeResource(context.getResources(), resId, options);    } | 
原文:http://www.cnblogs.com/lonelyonline/p/4448815.html