废话不多说,上代码:
(使用的方法很简单,把你的图片地址传进来,他就返回给你一个转换成base64的字串,2M可以压缩成76kb)
public static String myMethod(String imageUri){ // 设置参数 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // 只获取图片的大小信息,而不是将整张图片载入在内存中,避免内存溢出 BitmapFactory.decodeFile(imageUri, options); int height = options.outHeight; int width= options.outWidth; int inSampleSize = 2; // 默认像素压缩比例,压缩为原图的1/2 int minLen = Math.min(height, width); // 原图的最小边长 if(minLen > 200) { // 如果原始图像的最小边长大于200dp(此处单位我认为是dp,而非px) float ratio = (float)minLen / 200.0f; // 计算像素压缩比例 inSampleSize = (int)ratio; } options.inJustDecodeBounds = false; // 计算好压缩比例后,这次可以去加载原图了 options.inSampleSize = inSampleSize; // 设置为刚才计算的压缩比例 Bitmap bm = BitmapFactory.decodeFile(imageUri, options); // 解码文件 return Bitmap2StrByBase64(bm); }
/** * 将图片处理为base64字符串 */ public static String Bitmap2StrByBase64(Bitmap bit) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); bit.compress(Bitmap.CompressFormat.PNG, 40, bos);//参数100表示不压缩 byte[] bytes = bos.toByteArray(); return Base64.encodeToString(bytes, Base64.DEFAULT); }
如果还要压缩到更小:
压缩几百倍,但是图像会是真,如果只是上传一个个人头像的话可以使用,其他就不建议了,一下方法可压缩倒5kb一下,保守估计放大以后除非自己照的不然不好想明白。
注意,一下方法是传入一个图片的地址,返回一个压缩过的文件:
//传入地址,返回一个文件夹 public static File myMethod(String imageUri) { // 设置参数 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // 只获取图片的大小信息,而不是将整张图片载入在内存中,避免内存溢出 BitmapFactory.decodeFile(imageUri, options); int height = options.outHeight;// int width = options.outWidth;// int inSampleSize = 2; // 默认像素压缩比例,压缩为原图的1/2 int minLen = Math.min(height, width); // 原图的最小边长 if (minLen > 200) { // 如果原始图像的最小边长大于200dp(此处单位我认为是dp,而非px) float ratio = (float) minLen / 100.0f; // 计算像素压缩比例 inSampleSize = (int) ratio; } options.inJustDecodeBounds = false; // 计算好压缩比例后,这次可以去加载原图了 options.inSampleSize = inSampleSize; // 设置为刚才计算的压缩比例 Bitmap bm = BitmapFactory.decodeFile(imageUri, options); // 解码文件,将文件转换成Base64字符串的时候的操作 //return Bitmap2StrByBase64(bm); File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); if (!file.exists()) { file.mkdirs(); } File mFile = new File(file, System.currentTimeMillis() + ".jpg"); return saveFile(bm, mFile.getAbsolutePath(), mFile.getName()); } /** * 将Bitmap转换成文件 * 保存文件 * @param bm * @param fileName * @throws IOException */ public static File saveFile(Bitmap bm, String path, String fileName) { try { File dirFile = new File(path); if (!dirFile.exists()) { dirFile.mkdir(); } File myCaptureFile = new File(path, fileName); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile)); bm.compress(Bitmap.CompressFormat.JPEG, 40, bos);//这里设置再次压缩的倍数,100是不再压缩 bos.flush(); bos.close(); return myCaptureFile; } catch (IOException e) { e.printStackTrace(); LogUtil.e("bitmap转换过程中出错"+ e.getMessage()); } return null; }
请注意,会失真……
转载被人的,但是看的太多就这一个有用的,并多了几行无用的代码让我给闪了,或许原著看到请指明是为什么。
谢谢前辈的分享!
下面继续添加,国内最合适不失真的图片压缩(目前我只会处理单张压缩)luban
单张压缩倍数大概事二十倍左右,不是太准确,会因为更清晰压缩倍数更少变动:
使用方法:
compile 'top.zibin:Luban:1.1.3'
压缩代码:
//传入上下文对象 Luban.with(HindInActivity.this). //传入压缩图片路径 load(new File(capath)). //压缩结果监听 setCompressListener(new OnCompressListener() { //开始压缩 @Override public void onStart() {} //压缩成功 @Override public void onSuccess(File file) { files.add(file); } //压缩出错 @Override public void onError(Throwable e) {} }).launch();
谢谢前辈们的努力。