BitmapFactory.Options 通过采样率避免OOM

来源:互联网 发布:中国网络经纪人登录 编辑:程序博客网 时间:2024/05/14 04:58
  private static final String TAG = "ImageResizer";    public ImageResizer() {    }    public Bitmap decodeSampledBitmapFromResource(Resources res,            int resId, int reqWidth, int reqHeight) {        // First decode with inJustDecodeBounds=true to check dimensions        final BitmapFactory.Options options = new BitmapFactory.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;        return BitmapFactory.decodeResource(res, resId, options);    }    public Bitmap decodeSampledBitmapFromFileDescriptor(FileDescriptor fd, int reqWidth, int reqHeight) {        // First decode with inJustDecodeBounds=true to check dimensions        final BitmapFactory.Options options = new BitmapFactory.Options();        options.inJustDecodeBounds = true;        BitmapFactory.decodeFileDescriptor(fd, null, options);        // Calculate inSampleSize        options.inSampleSize = calculateInSampleSize(options, reqWidth,                reqHeight);        // Decode bitmap with inSampleSize set        options.inJustDecodeBounds = false;        return BitmapFactory.decodeFileDescriptor(fd, null, options);    }    public int calculateInSampleSize(BitmapFactory.Options options,            int reqWidth, int reqHeight) {        if (reqWidth == 0 || reqHeight == 0) {            return 1;        }        // Raw height and width of image        final int height = options.outHeight;        final int width = options.outWidth;        Log.d(TAG, "origin, w= " + width + " h=" + height);        int inSampleSize = 1;        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;            }        }        Log.d(TAG, "sampleSize:" + inSampleSize);        return inSampleSize;    }
0 0
原创粉丝点击