预压缩处理图片 options.inJustDecodeBounds = true

来源:互联网 发布:梦龙网络计划编制软件 编辑:程序博客网 时间:2024/05/16 01:35
    BitmapFactory.Options options = new BitmapFactory.Options();        options.inJustDecodeBounds = true;//只读取图片,不加载到内存中        BitmapFactory.decodeFile(file, options);        options.inSampleSize=computeSampleSize(options, -1, 512*512);//返回合适的inSampleSize值        options.inJustDecodeBounds = false;//加载到内存中        bitmap = BitmapFactory.decodeFile(file, options);

computeSampleSize 方法

    public static int computeSampleSize(BitmapFactory.Options options,                                        int minSideLength, int maxNumOfPixels) {        int initialSize = computeInitialSampleSize(options, minSideLength,                maxNumOfPixels);        int roundedSize;        if (initialSize <= 8) {            roundedSize = 1;            while (roundedSize < initialSize) {                roundedSize <<= 1;            }        } else {            roundedSize = (initialSize + 7) / 8 * 8;        }        return roundedSize;    }    public static int computeInitialSampleSize(BitmapFactory.Options options,                                               int minSideLength, int maxNumOfPixels) {        double w = options.outWidth;        double h = options.outHeight;        int lowerBound = (maxNumOfPixels == -1) ? 1 :                (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));        int upperBound = (minSideLength == -1) ? 128 :                (int) Math.min(Math.floor(w / minSideLength),                        Math.floor(h / minSideLength));        if (upperBound < lowerBound) {            // return the larger one when there is no overlapping zone.            return lowerBound;        }        if ((maxNumOfPixels == -1) &&                (minSideLength == -1)) {            return 1;        } else if (minSideLength == -1) {            return lowerBound;        } else {            return upperBound;        }    }
0 0