图片压缩分为质量压缩和尺寸压缩,前者更改图片分辨率,不改变图片尺寸,后者着重于更改图尺寸(宽高)
尺寸压缩:通过计算BitmapFactory.Options 的 inSampleSize 得到较大大小的压缩图片bitmap,这种很容易造成oom,压缩后也有1-2M
质量压缩:根据设置压缩质量可将5M图片压缩到100KB下,尺寸不会改变
ByteArrayOutputStream bStream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 60, bStream);//60:图片压缩质量,100为不压缩,将压缩数据放到流中
通过尺寸压缩得到bitmap,.compress方法写入ByteArrayOutputStream中,.toByteArray()得到字节数组,写入文件
下面例子是通过将压缩后得到的流数据写入缓存文件,上传的文件
<span style="font-size:18px;">package com.bdyl.utils; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.os.Environment; import android.util.Log; import android.view.Display; import com.bdyl.constance.Logs; import com.loopj.android.http.Base64; public class BitmapUtils { //计算压缩比例 private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { // 源图片的宽度 int width = options.outWidth; int height = options.outHeight; int inSampleSize = 3; if (width > reqWidth && height > reqHeight) { // 计算出实际宽度和目标宽度的比率 int widthRatio = Math.round((float) width / (float) reqWidth); int heightRatio = Math.round((float) height / (float) reqHeight); inSampleSize = Math.max(widthRatio, heightRatio); } return inSampleSize; } /* * compress pic by bitmap.compress();and save to cacheFile </span>
<span style="font-size:18px;"><span style="white-space:pre"> </span> * pathName 选中图片的全路径 * return cacheFile path */ public static File compressToFile(Activity context, String pathName) { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true;//设置为true,调用decode不会被解析,直接得到他的原始尺寸 BitmapFactory.decodeFile(pathName, opts); // 调用上面定义的方法计算inSampleSize值 Display display = context.getWindowManager().getDefaultDisplay(); opts.inSampleSize = calculateInSampleSize(opts, display.getHeight(), display.getWidth()); // 使用获取到的inSampleSize值再次解析图片 opts.inJustDecodeBounds = false;//记得设置为false Bitmap bitmap = BitmapFactory.decodeFile(pathName, opts); ByteArrayOutputStream bStream = new ByteArrayOutputStream(); bitmap.compress(CompressFormat.PNG, 60, bStream);// 60:压缩质量100 代表不压缩 int option = 50; while (bStream.toByteArray().length / 1024 > 100) {//压缩后图片大小大于100kb,降低压缩质量,重新压缩 bStream.reset();//清空流数据 option -= 10; bitmap.compress(Bitmap.CompressFormat.JPEG, option, bStream);// 这里压缩options%,把压缩后的数据存放到baos中 } File file = new File(context.getCacheDir(), new File(pathName).getName()); FileOutputStream fos = null; try { fos = new FileOutputStream(file); fos.write(bStream.toByteArray()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } try { bStream.close(); } catch (IOException e) { e.printStackTrace(); } } return file;//返回文件 } } </span>