真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

android開發(fā)中項(xiàng)目實(shí)現(xiàn)一個圖片壓縮功能并能指定大小

android開發(fā)中項(xiàng)目實(shí)現(xiàn)一個圖片壓縮功能并能指定大小?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

十堰鄖陽網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)公司2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

1.首先是一個根據(jù)分辨率壓縮的類,首先對圖片進(jìn)行一次壓縮

  /**
  * 根據(jù)分辨率壓縮圖片比例
  *
  * @param imgPath
  * @param w
  * @param h
  * @return
  */
 private static Bitmap compressByResolution(String imgPath, int w, int h) {
  BitmapFactory.Options opts = new BitmapFactory.Options();
  opts.inJustDecodeBounds = true;
  BitmapFactory.decodeFile(imgPath, opts);

  int width = opts.outWidth;
  int height = opts.outHeight;
  int widthScale = width / w;
  int heightScale = height / h;

  int scale;
  if (widthScale < heightScale) { //保留壓縮比例小的
   scale = widthScale;
  } else {
   scale = heightScale;
  }

  if (scale < 1) {
   scale = 1;
  }
  Log.i(TAG,"圖片分辨率壓縮比例:" + scale);

  opts.inSampleSize = scale;

  opts.inJustDecodeBounds = false;

  Bitmap bitmap = BitmapFactory.decodeFile(imgPath, opts);

  return bitmap;
 }

2.第二就是循環(huán)對圖片的壓縮,直到壓縮到指定的大小以下為止(重要?。?/p>

 /**
  * 根據(jù)分辨率壓縮
  *
  * @param srcPath 圖片路徑
  * @param ImageSize 圖片大小 單位kb
  * @return
  */
 public static boolean compressBitmap(String srcPath, int ImageSize, String savePath) {
  int subtract;
  Log.i(TAG, "圖片處理開始..");
  Bitmap bitmap = compressByResolution(srcPath, 1024, 720); //分辨率壓縮
  if (bitmap == null) {
   Log.i(TAG, "bitmap 為空");
   return false;
  }
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  int options = 100;
  bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//質(zhì)量壓縮方法,這里100表示不壓縮,把壓縮后的數(shù)據(jù)存放到baos中
  Log.i(TAG, "圖片分辨率壓縮后:" + baos.toByteArray().length / 1024 + "KB");


  while (baos.toByteArray().length > ImageSize * 1024) { //循環(huán)判斷如果壓縮后圖片是否大于ImageSize kb,大于繼續(xù)壓縮
   subtract = setSubstractSize(baos.toByteArray().length / 1024);
   baos.reset();//重置baos即清空baos
   options -= subtract;//每次都減少10
   bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//這里壓縮options%,把壓縮后的數(shù)據(jù)存放到baos中
   Log.i(TAG, "圖片壓縮后:" + baos.toByteArray().length / 1024 + "KB");
  }
  Log.i(TAG, "圖片處理完成!" + baos.toByteArray().length / 1024 + "KB");
  try {
   FileOutputStream fos = new FileOutputStream(new File(savePath));//將壓縮后的圖片保存的本地上指定路徑中
   fos.write(baos.toByteArray());
   fos.flush();
   fos.close();
  } catch (Exception e) {
   e.printStackTrace();
  }

  if (bitmap != null) {
   bitmap.recycle();
  }

  return true; //壓縮成功返回ture
 }

在這其中 

 /**
  * 根據(jù)圖片的大小設(shè)置壓縮的比例,提高速度
  *
  * @param imageMB
  * @return
  */
 private static int setSubstractSize(int imageMB) {

  if (imageMB > 1000) {
   return 60;
  } else if (imageMB > 750) {
   return 40;
  } else if (imageMB > 500) {
   return 20;
  } else {
   return 10;
  }

 }

這個方法用來動態(tài)設(shè)置每次壓縮的比例,主要用于提升壓縮的時間,這其中的數(shù)值是我大概測試出來的可以修改成你認(rèn)為比較合適的

3.最后

壓縮圖片費(fèi)時又費(fèi)內(nèi)存,很明顯執(zhí)行的時候需要在子線程中完成,如果需要的話可以加一個壓縮完成的監(jiān)聽

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。


新聞名稱:android開發(fā)中項(xiàng)目實(shí)現(xiàn)一個圖片壓縮功能并能指定大小
路徑分享:http://weahome.cn/article/pioepi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部