Android图片压缩—可按照图片大小压缩

简介:最近在做图片上传的相关功能,需要对图片的大小和尺寸进行压缩处理。

好处:(1)提升性能(2)节省流量

一、图片大小循环压缩
/**
     * 压缩图片文件到指定大小
     *
     * @param filePath
     */
    public static void compressBmpToFile(String filePath) {
        Bitmap bitmap = BitmapFactory.decodeFile(filePath);
        if (null == bitmap) {
            return;
        }
        final int BYTE_LEN = 1024;
        //文件最大为200KB
        final int MAX_FILE_SIZE = 256;
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int quality = 90;
        bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
        while (baos.toByteArray().length / BYTE_LEN > MAX_FILE_SIZE) {
            baos.reset();
            quality -= 10;
            bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
            float size = calculteBitmapSize(bitmap);
        }
        try {
            final FileOutputStream fos = new FileOutputStream(new File(filePath));
            fos.write(baos.toByteArray());
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
/**
     * 计算bitmap的大小
     *
     * @param bitmap
     * @return bitmap的大小单位KB
     */
    public static float calculteBitmapSize(Bitmap bitmap) {
        if (null == bitmap) {
            return 0.0f;
        }
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        final float size = (baos.toByteArray().length / 1024);
        try {
            baos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return size;
    }
二、图片尺寸压缩
/**
     * 压缩图片的尺寸
     *
     * @param srcPath
     * @return
     */
    public static Bitmap compressImageFromFile(String srcPath) {
        final BitmapFactory.Options newOpts = new BitmapFactory.Options();
        //只读边,不读内容
        newOpts.inJustDecodeBounds = true;
        // 获取这个图片的宽和高,注意此处的bitmap为null
        BitmapFactory.decodeFile(srcPath, newOpts);
        newOpts.inJustDecodeBounds = false;
        int w = newOpts.outWidth;
        int h = newOpts.outHeight;
        float hh = 800f;
        float ww = 480f;
        int be = 1;
        if (w > h && w > ww) {
            be = (int) (newOpts.outWidth / ww);
        } else if (w < h && h > hh) {
            be = (int) (newOpts.outHeight / hh);
        }
        if (be <= 0) {
            be = 1;
        }
        //设置采样率
        newOpts.inSampleSize = be;
        //该模式是默认的,可不设
        newOpts.inPreferredConfig = Bitmap.Config.RGB_565;
        // 同时设置才会有效
        newOpts.inPurgeable = true;
        //当系统内存不够时候图片自动被回收
        newOpts.inInputShareable = true;
        final Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
        return bitmap;
    }
三、Luban压缩
Github:Luban图片压缩
四、图片选择器
PictureSelector图片选择器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ronindong

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值