Android图片压缩方式

来源:互联网 发布:核密度估计算法 编辑:程序博客网 时间:2024/05/29 19:54

一.图片的存在形式

1.文件形式(即以二进制形式存在于硬盘上)
2.流的形式(即以二进制形式存在于内存中)
3.Bitmap形式
这三种形式的区别: 文件形式和流的形式对图片体积大小并没有影响,也就是说,如果你手机SD卡上的如果是100K,那么通过流的形式读到内存中,也一定是占100K的内存,注意是流的形式,不是Bitmap的形式,当图片以Bitmap的形式存在时,其占用的内存会瞬间变大, 500K文件形式的图片加载到内存,以Bitmap形式存在时,占用内存将近10M,当然这个增大的倍数并不是固定的

检测图片三种形式大小的方法:
文件形式: file.length()
流的形式: 讲图片文件读到内存输入流中,看它的byte数

二.常见的压缩方式

*******************************图片压缩两种方式*******************************************
一.质量压缩法
/** * 压缩方式一:质量压缩方法 * * @param image * @return */public static Bitmap compressImage(Bitmap image) {   ByteArrayOutputStream baos = new ByteArrayOutputStream();   //质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos   image.compress(Bitmap.CompressFormat.JPEG, 100, baos);   int options = 100;   //循环判断如果压缩后图片是否大于100kb,大于继续压缩   while (baos.toByteArray().length / 1024 > 100) {      //重置baos即清空baos      baos.reset();      //这里压缩options%,把压缩后的数据存放到baos      image.compress(Bitmap.CompressFormat.JPEG, options, baos);      options -= 10;//每次都减少10   }   //把压缩后的数据baos存放到ByteArrayInputStream   ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());   //ByteArrayInputStream数据生成图片   Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);   return bitmap;}

二.图片按比例压缩
/** * 压缩方式二:图片按比例大小压缩方法(根据路径获取图片并压缩) * * @param srcPath * @return */public static Bitmap getimage(String srcPath) {   BitmapFactory.Options newOpts = new BitmapFactory.Options();   //开始读入图片,此时把options.inJustDecodeBounds 设回true   newOpts.inJustDecodeBounds = true;   //此时返回bm为空   Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);   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图片压缩) * * @param image * @return */public static Bitmap comp(Bitmap image) {   ByteArrayOutputStream baos = new ByteArrayOutputStream();   image.compress(Bitmap.CompressFormat.JPEG, 100, baos);   //判断如果图片大于1M,进行压缩避免在生成图片   //BitmapFactory.decodeStream)时溢出   if (baos.toByteArray().length / 1024 > 1024) {      baos.reset();//重置baos即清空baos      //这里压缩50%,把压缩后的数据存放到baos      image.compress(Bitmap.CompressFormat.JPEG, 50, baos);   }   ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());   BitmapFactory.Options newOpts = new BitmapFactory.Options();   //开始读入图片,此时把options.inJustDecodeBounds 设回true   newOpts.inJustDecodeBounds = true;   Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);   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   isBm = new ByteArrayInputStream(baos.toByteArray());   bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);   return compressImage(bitmap);//压缩好比例大小后再进行质量压缩}

0 0