在开发Android应用时,会经常上传图片到服务器,会经常出现上传图片失败和时间过长的问题
为了解决这个问题,决定把照片进行压缩后上保存后本地缓存文件夹后再上传
使用方法:
//压缩后得到新的图片路径
- BitmapUtils.compressImageUpload
- BitmapUtils.deleteCacheFile()
- public class BitmapUtils {
- /**
- * 质量压缩方法
- *
- * @param image
- * @return
- */
- private static Bitmap compressImage(Bitmap image) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
- int options = 100;
- while (baos.toByteArray().length / 1024 > 100) {
- baos.reset();
- image.compress(Bitmap.CompressFormat.JPEG, options, baos);
- options -= 10;
- }
- ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
- Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);
- return bitmap;
- }
- /**
- * 图片按比例大小压缩方法(根据路径获取图片并压缩)
- *
- * @param srcPath
- * @return
- */
- private static Bitmap getImage(String srcPath) {
- BitmapFactory.Options newOpts = new BitmapFactory.Options();
- newOpts.inJustDecodeBounds = true;
- Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);// 此时返回bm为空
- newOpts.inJustDecodeBounds = false;
- int w = newOpts.outWidth;
- int h = newOpts.outHeight;
- // 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
- float hh = 800f;// 这里设置高度为800f
- float ww = 480f;// 这里设置宽度为480f
- // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
- int be = 1;// 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;// 设置缩放比例
- // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
- bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
- return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩
- }
- /**
- * 将压缩的bitmap保存到SDCard卡临时文件夹,用于上传
- *
- * @param filename
- * @param bit
- * @return
- */
- private static String saveMyBitmap(String filename, Bitmap bit) {
- String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath()+"/laopai/";
- String filePath = baseDir + filename;
- File dir = new File(baseDir);
- if (!dir.exists()) {
- dir.mkdir();
- }
- File f = new File(filePath);
- try {
- f.createNewFile();
- FileOutputStream fOut = null;
- fOut = new FileOutputStream(f);
- bit.compress(Bitmap.CompressFormat.PNG, 100, fOut);
- fOut.flush();
- fOut.close();
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- return filePath;
- }
- /**
- * 压缩上传路径
- * @param path
- * @return
- */
- public static String compressImageUpload(String path) {
- String filename = path.substring(path.lastIndexOf("/") + 1);
- Bitmap image = getImage(path);
- return saveMyBitmap(filename, image);
- }
- /**
- * 清除缓存文件
- */
- public static void deleteCacheFile(){
- File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/laopai/");
- RecursionDeleteFile(file);
- }
- /**
- * 递归删除
- */
- private static void RecursionDeleteFile(File file){
- if(file.isFile()){
- file.delete();
- return;
- }
- if(file.isDirectory()){
- File[] childFile = file.listFiles();
- if(childFile == null || childFile.length == 0){
- file.delete();
- return;
- }
- for(File f : childFile){
- RecursionDeleteFile(f);
- }
- file.delete();
- }
- }
- }