public static File compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos); // 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 int options = 90 ; while (baos.size() > 153600) { // 循环判断如果压缩后图片是否大于150kb,大于继续压缩 baos.reset(); // 重置baos即清空baos image.compress(Bitmap.CompressFormat.JPEG, options, baos); // 这里压缩options%,把压缩后的数据存放到baos中 options = options - 10; // 每次都减少10 UtilsLog.e(options + " " + baos.size()); String sdCardDir = Environment.getExternalStorageDirectory() + "/qcjrHuaXia/" ; File file = null ; try { File dirFile = new File(sdCardDir); if (!dirFile.exists()) { // 如果不存在,那就建立这个文件夹 dirFile.mkdirs(); String fileName = String.valueOf(System.currentTimeMillis()); file = new File(sdCardDir, fileName + ".jpg" ); FileOutputStream fos = new FileOutputStream(file); baos.writeTo(fos); fos.flush(); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); UtilsLog.e( " options123-->" + file.length()); return file;

代码虽然只控制了不能大于150Kb,但是出来的图片大小几乎都符合我需求的100kb~150Kb范围内,因为他每次都压缩质量不是很大。

二:遇到的问题

虽然上面内实现图片压缩,但是超过1MB的图片,压缩会很慢。然而现在手机拍出的图片几乎都是6MB左右的样子。

所以为了优化节省压缩时间,我采用了,

先通过在github上找的图片压缩工具 CompressHelper ,(附上地址 https://github.com/nanchen2251/CompressHelper)

先把超过1MB的图片压缩一下,更改了默认的压缩设置防止其压缩率太大.

 public File compressToFile(File file, int num) {
        return BitmapUtil.compressImage(context, Uri.fromFile(file), 1080, 1920,
                compressFormat, bitmapConfig, num, destinationDirectoryPath,
                fileNamePrefix, fileName);

之后在把这个压缩后的图片,在进行循环压缩,就很快了。

需求达成。