android 图片压缩

android 图片压缩一般有两种方式

1是质量压缩法2是大小压缩法   一般是根据用的比较多的是质量压缩法 大小压缩对于清晰度影响比较大.

 

质量压缩法

Bitmap bitmap=BitmapFactory.decodeFile(file.getPath());

ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中  
        while ( baos.toByteArray().length / 1024>100) {  //循环判断如果压缩后图片是否大于100kb,大于继续压缩        
            baos.reset();//重置baos即清空baos  

            int options = 100;           

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

 

 

  1. /**
  2.      * 分辨率压缩 在质量压缩
  3.      *
  4.      * @param 路劲
  5.      * @return </br> 处理之后的路劲
  6.      * @throws IOException
  7.      */ 
  8.     public static String perUploadPic(String path) { 
  9.         ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
  10.         BitmapFactory.Options newOpts = new BitmapFactory.Options(); 
  11.         newOpts.inJustDecodeBounds = true
  12.         BitmapFactory.decodeFile(path, newOpts);// 打开空图片获取分辨率 
  13.         newOpts.inSampleSize = getinSampleSize(newOpts);// 设置缩放倍数 
  14.         newOpts.inJustDecodeBounds = false
  15.         try
  16.             Bitmap bitmap1 = BitmapFactory.decodeFile(path, newOpts); 
  17.             bitmap1.compress(CompressFormat.JPEG, 80, baos); 
  18.         } catch (OutOfMemoryError e) { 
  19.             Log.e("OutOfMemoryError", "图片上传压缩初次分辨率失败"); 
  20.             newOpts.inSampleSize = newOpts.inSampleSize + 2
  21.             Bitmap bitmap1 = BitmapFactory.decodeFile(path, newOpts); 
  22.             bitmap1.compress(CompressFormat.JPEG, 80, baos); 
  23.         } 
  24.         Log.e("压缩后分辨率:", newOpts.outWidth + "*" + newOpts.outHeight); 
  25.         Log.e("分辨率压缩后的大小:", (baos.toByteArray().length / 1024) + ""); 
  26.  
  27.         // ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
  28.         // baos.write(bytes); 
  29.         Bitmap bitmap = null
  30.         int options = 90
  31.         while (baos.toByteArray().length / 1024 > 100) { // 
  32.             if (bitmap == null
  33.                 bitmap = BitmapFactory.decodeByteArray(baos.toByteArray(), 0
  34.                         baos.toByteArray().length); 
  35.             else 
  36.                 baos.reset(); 
  37.             bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);// 
  38.             options -= 5;// 
  39.             Log.e("baos.toByteArray().length:", +baos.toByteArray().length + ""); 
  40.         } 
  41.         Log.e("质量压缩后的大小:", (baos.toByteArray().length / 1024) + ""); 
  42.         FileOutputStream out = null
  43.         File file = null
  44.         try
  45.             String[] name = path.split("/");//路劲大家自己写哈 
  46.             file = new File(getSDPath() + "/" + Constant.path.PAHN + "/" 
  47.                     + Constant.path.cameraper + "/" + name[name.length - 1]); 
  48.             if (!file.getParentFile().exists()) 
  49.                 file.getParentFile().mkdirs(); 
  50.             if (!file.exists()) 
  51.                 file.createNewFile(); 
  52.             out = new FileOutputStream(file); 
  53.             out.write(baos.toByteArray()); 
  54.             out.flush(); 
  55.             out.close(); 
  56.         } catch (IOException e) { 
  57.             // TODO Auto-generated catch block 
  58.             try
  59.                 out.close(); 
  60.                 baos.reset(); 
  61.                 baos = null
  62.             } catch (IOException e1) { 
  63.                 // TODO Auto-generated catch block 
  64.                 e1.printStackTrace(); 
  65.             } 
  66.             Log.e("yung", "待上传图片压缩处理失败:" + path); 
  67.             e.printStackTrace(); 
  68.         } 
  69.  
  70.         return file.getAbsolutePath(); 
  71.     } 
  1. /**
  2.      * 获取图片压缩的比率
  3.      *
  4.      * @param options
  5.      * @return
  6.      */ 
  7.     public static int getinSampleSize(BitmapFactory.Options options) { 
  8.         final int height = options.outHeight; 
  9.         final int width = options.outWidth; 
  10.         float reqHeight = 960.0f;//根据自己需要确定分辨率长或者宽最大不超过960 并且按照原来比例 
  11.         float reqWidth = 960.0f; 
  12.         int inSampleSize = 1
  13.  
  14.         if (height > width && height > reqHeight) { 
  15.             inSampleSize = (int) Math.ceil(height / reqHeight); 
  16.  
  17.         } else if (height <= width && width > reqWidth) { 
  18.             inSampleSize = (int) Math.ceil(width / reqWidth); 
  19.  
  20.         } 
  21.         System.out.println("压缩前分辨率:" + width + "*" + height + "     压缩倍数:" 
  22.                 + inSampleSize); 
  23.         return inSampleSize; 
  24.     }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值