关于图片的压缩处理

  1. 第一:我们先看下质量压缩方法:

  2. Java代码  收藏代码

  3. private Bitmap compressImage(Bitmap image) {  

  4.  

  5.        ByteArrayOutputStream baos = new ByteArrayOutputStream();  

  6.        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中  

  7.        int options = 100;  

  8.        while ( baos.toByteArray().length / 1024>100) {  //循环判断如果压缩后图片是否大于100kb,大于继续压缩        

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

  10.            image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中  

  11.            options -= 10;//每次都减少10  

  12.        }  

  13.        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中  

  14.        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片  

  15.        return bitmap;  

  16.    }  

  17. 第二:图片按比例大小压缩方法(根据路径获取图片并压缩):

  18. Java代码  收藏代码

  19. private Bitmap getimage(String srcPath) {  

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

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

  22.        newOpts.inJustDecodeBounds = true;  

  23.        Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空  

  24.          

  25.        newOpts.inJustDecodeBounds = false;  

  26.        int w = newOpts.outWidth;  

  27.        int h = newOpts.outHeight;  

  28.        //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为  

  29.        float hh = 800f;//这里设置高度为800f  

  30.        float ww = 480f;//这里设置宽度为480f  

  31.        //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可  

  32.        int be = 1;//be=1表示不缩放  

  33.        if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放  

  34.            be = (int) (newOpts.outWidth / ww);  

  35.        } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放  

  36.            be = (int) (newOpts.outHeight / hh);  

  37.        }  

  38.        if (be <= 0)  

  39.            be = 1;  

  40.        newOpts.inSampleSize = be;//设置缩放比例  

  41.        //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了  

  42.        bitmap = BitmapFactory.decodeFile(srcPath, newOpts);  

  43.        return compressImage(bitmap);//压缩好比例大小后再进行质量压缩  

  44.    }  

  45. 第三:图片按比例大小压缩方法(根据Bitmap图片压缩):

  46. Java代码  收藏代码

  47. private Bitmap comp(Bitmap image) {  

  48.      

  49.    ByteArrayOutputStream baos = new ByteArrayOutputStream();        

  50.    image.compress(Bitmap.CompressFormat.JPEG, 100, baos);  

  51.    if( baos.toByteArray().length / 1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出    

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

  53.        image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中  

  54.    }  

  55.    ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());  

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

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

  58.    newOpts.inJustDecodeBounds = true;  

  59.    Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  

  60.    newOpts.inJustDecodeBounds = false;  

  61.    int w = newOpts.outWidth;  

  62.    int h = newOpts.outHeight;  

  63.    //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为  

  64.    float hh = 800f;//这里设置高度为800f  

  65.    float ww = 480f;//这里设置宽度为480f  

  66.    //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可  

  67.    int be = 1;//be=1表示不缩放  

  68.    if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放  

  69.        be = (int) (newOpts.outWidth / ww);  

  70.    } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放  

  71.        be = (int) (newOpts.outHeight / hh);  

  72.    }  

  73.    if (be <= 0)  

  74.        be = 1;  

  75.    newOpts.inSampleSize = be;//设置缩放比例  

  76.    //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了  

  77.    isBm = new ByteArrayInputStream(baos.toByteArray());  

  78.    bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  

  79.    return compressImage(bitmap);//压缩好比例大小后再进行质量压缩  

  80. }  



转载于:https://my.oschina.net/u/928906/blog/624653

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值