android 比較靠譜的圖片壓縮

第一:咱們先看下質量壓縮方法:java

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
     }
?
1
第二:圖片按比例大小壓縮方法(根據路徑獲取圖片並壓縮):
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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); //壓縮比如例大小後再進行質量壓縮
  }
?
1
第三:圖片按比例大小壓縮方法(根據Bitmap圖片壓縮):
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  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); //壓縮比如例大小後再進行質量壓縮
  }
相關文章
相關標籤/搜索