`
licjava
  • 浏览: 14270 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android上图片压缩方式

阅读更多

第一:我们先看下质量压缩方法:
 
  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; 
    } 
 
 
 第二:图片按比例大小压缩方法(根据路径获取图片并压缩):
 
 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);//压缩好比例大小后再进行质量压缩 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics