【Android】图片压缩

来源:互联网 发布:java调用webkit内核 编辑:程序博客网 时间:2024/06/07 02:56

图片是app中必不可少的元素,同时也引出俩个问题:内存和流量。图片压缩可分为尺寸压缩和质量压缩,

            //1、图片尺寸压缩            Bitmap bm = getSmallBitmap(path,600,800);            File f = new File(path);            if (f.exists()) {                f.delete();            }            //2、图片质量压缩            ByteArrayOutputStream baos = new ByteArrayOutputStream();            bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);            // 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中            int options = 100;            while (baos.toByteArray().length / 1024 > 150) {                // 循环判断如果压缩后图片是否大于150kb,大于继续压缩                baos.reset();// 重置baos即清空baos                bm.compress(Bitmap.CompressFormat.JPEG, options, baos);                // 这里压缩options%,把压缩后的数据存放到baos中                options -= 10;// 每次都减少10(值越小越精确,压缩时间也越长,自己根据需要调整)                if (options <= 0) {                    break;                }            }            out = new FileOutputStream(path);            out.write(baos.toByteArray());            if (!bm.isRecycled()) {                bm.recycle();            }
    /**     * 图片尺寸压缩     *     * @param filePath     * @return     */    public Bitmap getSmallBitmap(String filePath, int reqWidth, int reqHeight) {        final BitmapFactory.Options options = new BitmapFactory.Options();        options.inJustDecodeBounds = true;//true表示只读取读片信息,不读入内存,所以要读取图片decodeFile之类的,必须设为false,否则返回null        BitmapFactory.decodeFile(filePath, options);        if(options.outHeight > options.outWidth) {            //竖屏拍,高>宽            options.inSampleSize = calculateInSimpleSize(options, reqWidth, reqHeight);        } else {            //横屏拍,宽>高            options.inSampleSize = calculateInSimpleSize(options, reqHeight, reqWidth);        }        options.inJustDecodeBounds = false;        return BitmapFactory.decodeFile(filePath, options);    }    /**     * 计算图片压缩比例     *     * @param options     * @param reqWidth     * @param reqHeight     * @return     */    public int calculateInSimpleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {        final int height = options.outHeight;        final int width = options.outWidth;        int inSimpleSize = 1;        if (width > reqWidth || height > reqHeight) {            final int halfWidth = width / 2;            final int halfHeight = height / 2;            // 计算出最大的inSampleSize的值(2的幂),并保持图片宽高比请求的宽高大。            while ((halfWidth / inSimpleSize) > reqWidth                    && (halfHeight / inSimpleSize) > reqHeight) {                inSimpleSize *= 2;            }            return inSimpleSize * 2;        }        return inSimpleSize;    }


原创粉丝点击