Android图片压缩

1、质量压缩方法

通过compress的方法只是减小了文件的大小,但是并不能保证减低bitmap文件解码后在内存的占用量。

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

2、按比例大小压缩方法

对Bitmap形式的图片进行压缩, 也就是通过设置采样率, 减少Bitmap的像素, 从而减少了它所占用的内存

① 根据路径获取图片并压缩

private Bitmap getimage(String srcPath) {

  BitmapFactory.Options newOpts = new BitmapFactory.Options();

  //开始读入图片,此时把options.inJustDecodeBounds 设回true了

  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图片压缩

 private Bitmap comp(Bitmap image) {

  ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
  if( baos.toByteArray().length / 1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出 

   baos.reset();//重置baos即清空baos

   image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩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);//压缩好比例大小后再进行质量压缩

 }
时间: 2024-11-05 21:28:44

Android图片压缩的相关文章

android图片压缩的3种方法实例

android 图片压缩方法: 第一:质量压缩法: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream();        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中        int options = 100

Android图片压缩(质量压缩和尺寸压缩)

在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩):质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可用于生成缩略图.两种方法都实装在了我的项目中,结果却发现在质量压缩的模块中,本来1.9M的图片压缩后反而变成3M多了,很是奇怪,再做了进一步调查终于知道原因了.下面这个博客说的比较清晰: android图片压缩总结 总结来看,图片有三种存在形式:硬盘上时是fi

Android图片压缩技巧

请尊重他人的劳动成果,转载请注明出处:Android图片压缩技巧 http://blog.csdn.net/fengyuzhengfan/article/details/41759835 当需要将Android客户端的图片上传到服务器时,往往需要将图片进行压缩,关于图片的压缩方法,小编分享几种常用的方式: 第一种方式:裁切以达到压缩的目的 我曾在<Android开发之裁剪照片>一文中详细介绍过如何裁切照片,感兴趣的朋友可以去看一下. 第二种方式:将图片进行降质处理(即降低图片的质量)以达到压缩

android图片压缩方法

第一:我们先看下质量压缩方法 private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 int options = 100; while ( baos.toByteArra

android图片压缩总结

首先该文章是总结, 不是原创, 是通过看网上其他大神的文章和自己的一些实践总结出来的. 一.图片的存在形式 1.文件形式(即以二进制形式存在于硬盘上)2.流的形式(即以二进制形式存在于内存中)3.Bitmap形式 这三种形式的区别: 文件形式和流的形式对图片体积大小并没有影响,也就是说,如果你手机SD卡上的如果是100K,那么通过流的形式读到内存中,也一定是占100K的内存,注意是流的形式,不是Bitmap的形式,当图片以Bitmap的形式存在时,其占用的内存会瞬间变大, 我试过500K文件形式

android图片压缩上传系列-service篇

本篇文章是继续上篇android图片压缩上传系列-基础篇文章的续篇.主要目的是:通过Service来执行图片压缩任务来讨论如何使用Service,如何处理任务量大的并发问题. 了解下Service 大家都知道如果有费时任务,这时需要将任务放到后台线程中执行,如果对操作的结果需要通过ui展示还需要在任务完成后通知前台更新.当然对于这种情况,大家也可以在Activity中启动线程,在线程中通过Handler和sendMessage来通知Activity并执行更新ui的操作,但是更好的方法是将这些操作

android图片压缩质量参数Bitmap.Config RGB_565等的含义

android图片压缩质量参数 在实用ImageLoader中,在配置DisplayImageOptions时,需要设置.bitmapConfig(Bitmap.Config.RGB_565) 那么这个 Bitmap.Config.RGB_565 是什么意思呢 ? 在android中的大图片一般都要经过压缩才能显示,不然容易发生oom,一般我们压缩的时候都只关注其尺寸方面的大小,其实除了尺寸之外,影响一个图片占用空间的还有其色彩细节. 打开Android.graphics.Bitmap类里有一个

Android图片压缩方法总结

本文总结Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 第一:质量压缩方法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 private Bitmap compressImage(Bitmap image) {           ByteArrayOutputStream baos = new ByteArrayOutputStream();         image

(转)Android图片压缩方法总结

本文总结Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). http://www.open-open.com/lib/view/open1413862305997.html 第一:质量压缩方法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 private Bitmap compressImage(Bitmap image) {           ByteArrayOutpu

android 图片压缩

图片压缩BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = false; options.inPurgeable = true; options.inInputShareable = true; // Do not compress options.inSampleSize = 1; options.inPreferredConfig = Config.ARGB_888