package com.wisedu.scc.love.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; /** * 图片压缩 */ public class ImageUtil { /** * 图片压缩方法实现 * @param srcPath 原图地址 * @param finishPath 压缩后保存图片地址 * @param avatorPath 保存的文件夹路径 * @return */ public static Bitmap compressImage(String srcPath, String finishPath, String avatorPath) { BitmapFactory.Options newOpts = new BitmapFactory.Options(); // 开始读入图片,此时把options.inJustDecodeBounds 设回true了 newOpts.inJustDecodeBounds = true; newOpts.inJustDecodeBounds = false; int w = newOpts.outWidth; int h = newOpts.outHeight; int hh = 800;// 这里设置高度为800f int ww = 480;// 这里设置宽度为480f // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 int be = 1;// be=1表示不缩放 if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放 be = (newOpts.outWidth / ww); } else if (w < h && h > hh) {// 如果高度高的话根据高度固定大小缩放 be = (newOpts.outHeight / hh); } if (be <= 0) be = 1; newOpts.inSampleSize = be;// 设置缩放比例 // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了 Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts); return compressImage(bitmap, finishPath, avatorPath);// 压缩好比例大小后再进行质量压缩 } /** * 质量压缩 * @param image * @return */ private static Bitmap compressImage(Bitmap image, String finishPath, String avatorpath) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 60, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 int options = 60; while (baos.toByteArray().length / 1024 > 100) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩 baos.reset();// 重置baos即清空baos options -= 10;// 每次都减少10 image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中 } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片 try { File fileDir = new File(avatorpath); if (!fileDir.exists()) { fileDir.mkdirs();// 创建文件夹 } FileOutputStream out = new FileOutputStream(finishPath); bitmap.compress(Bitmap.CompressFormat.PNG, 60, out); } catch (Exception e) { e.printStackTrace(); } return bitmap; } }