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/)


转载链接:http://104zz.iteye.com/blog/1694762

android bitmap图片压缩

  • 2012年07月25日 12:12
  • 30KB
  • 下载

Android 图片压缩,Bitmap优化

Bitmap是导致OOM的一个最重要的问题。通常我们会对图片进行压缩来避免OOM。下面总结了几种对图片进行压缩的方法。 对图片进行压缩,无外乎两种方法:对图片质量进行压缩、对图片尺寸进行压缩。我在网...

Android bitmap压缩本地图片

由于G20没地方完去了, 所以在这里写写博客,不写博客的程序员不是好裁缝!很多人会遇到这样的问题,不知道图片如何压缩之后再适配到android中的组件,如imageview等,因为android中产生...

Android图片压缩与缩放,Bitmap和Drawable相互转换(转)

本文转自http://blog.csdn.net/demonliuhui/article/details/62425151 根据Bitmap压缩图片 该方法不适用特别大的图片,如果图片过大会及其耗时...

Android的Bitmap图片压缩与内存的关系

我们做Android应用的时候最不可避免的就是与图片打交道,而图片通常又是应用内存开销,影响性能的大头,因而这也是网上的帖子关于图片方面的内容热度比较高的原因之一。另外,发现身边的一些做Android...

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

android图片压缩质量参数Bitmap.Config RGB_565等的含义 android图片压缩质量参数 在实用ImageLoader中,在配置DisplayImageOp...

android 通过uri获取bitmap图片并压缩

很多人在调用图库选择图片时会在onActivityResult中用Media.getBitmap来获取返回的图片,如下: [java] view plain copy ...

[Android算法] bitmap 将图片压缩到指定的大小

[Android算法] bitmap 将图片压缩到指定的大小 分类: Android图片处理 Android学习笔记2012-07-13 16:33 11335人阅读 评论(4) 收藏 举报 ...
  • bjash
  • bjash
  • 2015年10月28日 10:50
  • 1390

[Android算法] bitmap 将图片压缩到指定的大小

第一部分: 不多说直接上代码,代码中在做仔细解释: private void imageZoom() {                 //图片允许最大空间   单位:KB         ...
  • infsafe
  • infsafe
  • 2012年07月13日 16:33
  • 46365

Android图片的压缩和Bitmap转化为String传输

一.图片占用内存的计算方法 单位:bit(位),byte(字节) 二进制数系统中,每个0或1就是一个位(bit),位是数据存储的最小单位。其中8bit就称为一个字节(Byte)。 计算机中的CP...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中Bitmap图片压缩
举报原因:
原因补充:

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