android 图片压缩上传

1、将得到的图片path转换成Bitmap

 public static Bitmap getBitmap(String filePath) {
        Bitmap bitmap = null;
        File file = new File(filePath);
        if (file.exists()) {
            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.RGB_565;
            options.inPurgeable = true;
            options.inInputShareable = true;
            try {
                bitmap = BitmapFactory.decodeFile(filePath, options);
                if (bitmap == null) {
                    file.delete();
                }
            } catch (OutOfMemoryError e) {
                e.printStackTrace();

                if (bitmap != null && !bitmap.isRecycled()) {
                    bitmap.recycle();
                    bitmap = null;
                }
                System.gc();
            }
        }
        return bitmap;
    }
2、压缩

/**
     * 压缩图片大小直至其小于100kb
     * 注意:该方法是压缩图片的质量,它不会减少图片的像素,一般可用于上传大图前的处理,
     * 这样就可以节省一定的流量.
     * 另外它会让图片重新构造, 但是有可能图像的位深(即色深)和每个像素的透明度会变化,
     * 也就是说以jpeg格式压缩后, 原来图片中透明的元素将消失.所以这种格式很可能造成失真。
     * 图片确实被压缩了, 但是当重新读取压缩后的file为 Bitmap时,它占用的内存并没有改变
     * <p>
     * 即:(因为bigmap在内存中的大小是按像素计算的,也就是width * height,对于质量压缩,
     * 并不会改变图片的像素,所以就算质量被压缩了,但是bitmap在内存的占有率还是没变小,
     * 但你做成file时,它确实变小了)
     *
     * @param image 源Bitmap
     * @return 压缩后的Bitmap
     */
    public static Bitmap compressByQuality(Bitmap image) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
        int options = 90;
        while (baos.toByteArray().length / 1024 > 100 && options >= 10) { //
            // 循环判断如果压缩后图片是否大于100kb,大于继续压缩
            baos.reset();// 重置baos即清空baos
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);//
            // 这里压缩options%,把压缩后的数据存放到baos中
            options -= 10;// 每次都减少10
        }
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//
        // 把压缩后的数据baos存放到ByteArrayInputStream中
        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片
        return bitmap;
    }

    public static File compressByPath(String imgPath) {
        Bitmap bitmap = compressByQuality(getBitmap(imgPath));
        File file = new File(imgPath);
        if (bitmap != null && file.exists()) {
            BufferedOutputStream bos = null;
            try {
                bos = new BufferedOutputStream(new FileOutputStream(file));
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
                bos.flush();
                bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return file;
    }



猜你喜欢

转载自blog.csdn.net/zly19931101/article/details/61914889
今日推荐