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图片选择器

猜你喜欢

转载自blog.csdn.net/dhl91604/article/details/79022228
今日推荐