Android中Bitmap图片压缩

转载 2015年11月17日 20:31:49

按大小压缩

1、根据路径获取图片

private Bitmap getimage(String srcPath) {  
        BitmapFactory.Options newOpts = new BitmapFactory.Options();  
        //开始读入图片,此时把options.inJustDecodeBounds 设回true了  
        newOpts.inJustDecodeBounds = true;  
        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 bitmap;//压缩好比例大小后再进行质量压缩  
    }  

2、根据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 bitmap;//压缩好比例大小后再进行质量压缩  
}  

按质量压缩

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


Options中属性inJustDecodeBounds.可以利用它来避免图片的溢出问题。原理是什么?
API这样说:如果值设为true,那么将不返回实际的bitmap,也不给其分配内存空间,这样就避免了内存溢出。但是允许我们查询图片的信息,这其中就包括图片的大小信息(options.outHeight(图片的原始高度)和options.outWidth(图片的原始宽度))。
Options中属性:inSampleSize。我们可以充分利用它,实现缩放。
如果设置为>1,要求解码器解码出原始图片的一个子样本,返回一个较小的bitmap,以节省空间。
例如,inSampleSize==2,则取出的缩略图的宽和高都是原始图片的1/2,图片的大小就是原始图片的1/4。
对于任何值<=1的同样处置为1.
需要注意的是inSampleSize可能小于0,所以要进行判断。(转载内容自链接http://xiaomi4980.blog.163.com/blog/static/2159451962013102732131510/)


bitmap的六种压缩方式,Android图片压缩

bitmap的六种压缩方式,图片压缩 形式存在的,那么bitmap所占内存,直接影响到了应用所占内存大小,首先要知道bitmap所占内存大小计算方式:图片长度 x 图片宽度 x 一个像素点占用的字节...
  • HarryWeasley
  • HarryWeasley
  • 2016年07月20日 15:26
  • 36228

Android Bitmap 优化- 图片压缩

原文地址:http://anany.me/2015/10/15/bitmap1/ 一直以来Bitmap都是开发中很棘手的问题,这个问题就是传说中的OOM(java.lang.OutofMemor...
  • zly921112
  • zly921112
  • 2016年08月26日 10:41
  • 2733

Android图片压缩(质量压缩和尺寸压缩)&Bitmap转成字符串上传

在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩);质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手...
  • jdsjlzx
  • jdsjlzx
  • 2015年03月12日 22:38
  • 103768

最详细的Android图片压缩解释

如题,多种压缩方式常用的有尺寸压缩、质量压缩以及通过JNI调用libjpeg库来进行压缩,三种方式结合使用实现指定图片内存大小,清晰度达到最优,下面就先分别介绍下这几种压缩方式。 原文出处:ht...
  • u012246348
  • u012246348
  • 2016年12月09日 13:52
  • 4541

大图片压缩后,保存小图片到本地

目的:从本地path中获取bitmap,压缩后保存小图片到本地 涉及到的知识点: 根据ImageView获取适当的压缩的宽和高,尽可能得到ImageView的精确的宽高 通过反射...
  • Android_Study_OK
  • Android_Study_OK
  • 2016年05月15日 13:26
  • 2439

Android中常用的图片压缩方式

图片压缩方式常用的有尺寸压缩、质量压缩、格式变化以及通过JNI调用libjpeg库来进行压缩,下面就先分别介绍下常见的质量压缩和尺寸压缩。(尺寸压缩,质量压缩底层也是通过调用native的方法进行压缩...
  • huangbryant
  • huangbryant
  • 2018年01月11日 10:51
  • 80

Android 图片压缩实现过程代码

Android图片压缩非两种,一种质量压缩,一种像素压缩,前者多用于图片上传时,后者多用于本地图片展示缩略图时。总结并记录一下,方便以后使用。 具体的分析可以参考这篇文章,http://www.co...
  • Siobhan
  • Siobhan
  • 2016年02月19日 17:31
  • 1449

Android 中解决图片加载OOM 之 bitmap 压缩显示,压缩上传

java.lang.OutOfMemoryError OOM就是内存溢出,即Out Of Memory。也就是说内存占有量超过了VM所分配的最大。 现在的手机照相功能强大图片的大小往往达到好几...
  • u012889434
  • u012889434
  • 2015年11月08日 17:47
  • 1093

Android学习之利用BitmapFactory工厂压缩图片

BufferedInputStream in = new BufferedInputStream( new FileInputStream(new File(path))); BitmapFac...
  • u012527802
  • u012527802
  • 2015年08月20日 22:41
  • 1066

Android Bitmap压缩图像的正确方法(compress的误区)

这两天在做的一个app需要从相册里面载入图片,踩了几个坑,这里Mark一下。 现在的相机基本都是800W+像素,差一点的手机1M多,好点的手机拍出来接近3M,如果直接载入图片,那非常容易造成oom,尤...
  • adam_ling
  • adam_ling
  • 2016年08月28日 17:27
  • 25993
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中Bitmap图片压缩
举报原因:
原因补充:

(最多只允许输入30个字)