android 图片压缩

来源:互联网 发布:淘宝网海南黄花梨手串 编辑:程序博客网 时间:2024/05/21 07:12

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
        intw = newOpts.outWidth; 
        inth = 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
    intw = newOpts.outWidth; 
    inth = newOpts.outHeight; 
    //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为 
    floathh = 800f;//这里设置高度为800f 
    floatww = 480f;//这里设置宽度为480f 
    //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 
    intbe = 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); 
    returncompressImage(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 staticint 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