91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android開發中項目實現一個圖片壓縮功能并能指定大小

發布時間:2020-11-23 17:01:19 來源:億速云 閱讀:467 作者:Leah 欄目:移動開發

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

1.首先是一個根據分辨率壓縮的類,首先對圖片進行一次壓縮

  /**
  * 根據分辨率壓縮圖片比例
  *
  * @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.第二就是循環對圖片的壓縮,直到壓縮到指定的大小以下為止(重要!)

 /**
  * 根據分辨率壓縮
  *
  * @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);//質量壓縮方法,這里100表示不壓縮,把壓縮后的數據存放到baos中
  Log.i(TAG, "圖片分辨率壓縮后:" + baos.toByteArray().length / 1024 + "KB");


  while (baos.toByteArray().length > ImageSize * 1024) { //循環判斷如果壓縮后圖片是否大于ImageSize kb,大于繼續壓縮
   subtract = setSubstractSize(baos.toByteArray().length / 1024);
   baos.reset();//重置baos即清空baos
   options -= subtract;//每次都減少10
   bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//這里壓縮options%,把壓縮后的數據存放到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
 }

在這其中 

 /**
  * 根據圖片的大小設置壓縮的比例,提高速度
  *
  * @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;
  }

 }

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

3.最后

壓縮圖片費時又費內存,很明顯執行的時候需要在子線程中完成,如果需要的話可以加一個壓縮完成的監聽

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

垦利县| 鄢陵县| 冀州市| 和静县| 玛曲县| 海伦市| 林西县| 米易县| 简阳市| 越西县| 永胜县| 连平县| 正镶白旗| 拉孜县| 卓资县| 股票| 龙门县| 阿拉善盟| 石嘴山市| 京山县| 宣化县| 德格县| 铜山县| 噶尔县| 子长县| 石家庄市| 长垣县| 临武县| 达日县| 藁城市| 宿松县| 阜阳市| 龙井市| 新化县| 上饶县| 罗田县| 扎鲁特旗| 宁武县| 若尔盖县| 中卫市| 晋江市|