中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Android圖片實現壓縮處理的實例代碼

發布時間:2020-10-01 19:26:32 來源:腳本之家 閱讀:133 作者:MrZang 欄目:移動開發

整理文檔,搜刮出一個Android圖片實現壓縮處理的實例代碼,稍微整理精簡一下做下分享。

詳解:

1.獲取本地圖片File文件 獲取BitmapFactory.Options對象 計算原始圖片 目標圖片寬高比 計算輸出的圖片寬高

2.根據寬高比計算options.inSampleSize值(縮放比例 If set to a value > 1, requests the decoder to subsample the original image, returning a smaller image to save memory.)得到bitmap位圖 根據位圖對象獲取新的輸出位圖對象 Bitmap.createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter)Creates a new bitmap, scaled from an existing bitmap, whenpossible.

3.獲取圖片方向調整、失量壓縮圖片保持在1024kb以下

 //進行大小縮放來達到壓縮的目的
 BitmapFactory.Options options = new BitmapFactory.Options();
 options.inJustDecodeBounds = true;
 BitmapFactory.decodeFile(srcImagePath, options);
 //根據原始圖片的寬高比和期望的輸出圖片的寬高比計算最終輸出的圖片的寬和高

 float srcWidth = options.outWidth;
 float srcHeight = options.outHeight;
 float maxWidth = outWidth;
 float maxHeight = outHeight;
 float srcRatio = srcWidth / srcHeight; //原始圖片寬高比
 float outRatio = maxWidth / maxHeight; //目標圖片寬高比
 float actualOutWidth = srcWidth;
 float actualOutHeight = srcHeight;
  if (srcWidth > maxWidth || srcHeight > maxHeight) {
   if(srcRatio>outRatio){ //原始寬高比大于目標寬高比
     actualOutWidth = maxWidth;
     actualOutHeight = actualOutWidth / srcRatio;
   }else if(srcRatio<outRatio){ //原始寬高比小于目標寬高比
     actualOutHeight = maxHeight;
     actualOutWidth = actualOutHeight * srcRatio;
   }
 }else{
   actualOutWidth = maxWidth;
   actualOutHeight = maxHeight;
 }

 options.inSampleSize = computSampleSize(options, actualOutWidth, actualOutHeight);
 options.inJustDecodeBounds = false;
 Bitmap scaledBitmap = null;
 try {
   scaledBitmap = BitmapFactory.decodeFile(srcImagePath, options);
 } catch (OutOfMemoryError e) {
   e.printStackTrace();
 }
 if (scaledBitmap == null) {
   return null;
 }

  //生成最終輸出的bitmap
 Bitmap actualOutBitmap = Bitmap.createScaledBitmap(scaledBitmap, (int) actualOutWidth, (int) actualOutHeight, true);

 //釋放原始位圖資源
 if(scaledBitmap!=actualOutBitmap){ //判斷目標位圖是否和原始位圖指向棧目標相同
   scaledBitmap.recycle();
   scaledBitmap = null;
 }

  //處理圖片旋轉問題
 ExifInterface exif = null;
 try {
   exif = new ExifInterface(srcImagePath);
   int orientation = exif.getAttributeInt(
       ExifInterface.TAG_ORIENTATION, 0);
   Matrix matrix = new Matrix();
   if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
     matrix.postRotate(90);
   } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
     matrix.postRotate(180);
   } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
     matrix.postRotate(270);
   }
   actualOutBitmap = Bitmap.createBitmap(actualOutBitmap, 0, 0,
       actualOutBitmap.getWidth(), actualOutBitmap.getHeight(), matrix, true);
 } catch (IOException e) {
   e.printStackTrace();
   return null;
 }

  //進行有損壓縮
 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 int options_ = 100;
 actualOutBitmap.compress(Bitmap.CompressFormat.JPEG, options_, baos);//質量壓縮方法,把壓縮后的數據存放到baos中 (100表示不壓縮,0表示壓縮到最小)

 int baosLength = baos.toByteArray().length;

 while (baosLength / 1024 > maxFileSize) {//循環判斷如果壓縮后圖片是否大于maxMemmorrySize,大于繼續壓縮
   baos.reset();//重置baos即讓下一次的寫入覆蓋之前的內容
   options_ = Math.max(0, options_ - 10);//圖片質量每次減少10
   actualOutBitmap.compress(Bitmap.CompressFormat.JPEG, options_, baos);//將壓縮后的圖片保存到baos中
   baosLength = baos.toByteArray().length;
   if (options_ == 0)//如果圖片的質量已降到最低則,不再進行壓縮
     break;
 }
 actualOutBitmap.recycle();

 //將bitmap保存到指定路徑
 FileOutputStream fos = null;
 String filePath = getOutputFileName(srcImagePath);
 try {
   fos = new FileOutputStream(filePath);
   //包裝緩沖流,提高寫入速度
   BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fos);
   bufferedOutputStream.write(baos.toByteArray());
   bufferedOutputStream.flush();
 } catch (FileNotFoundException e) {
   return null;
 } catch (IOException e) {
   return null;
 } finally {
   if (baos != null) {
     try {
       baos.close();
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
   if (fos != null) {
     try {
       fos.close();
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
 }

 //獲取位圖縮放比例
 private int computSampleSize(BitmapFactory.Options options, float reqWidth, float reqHeight) {
   float srcWidth = options.outWidth;//20
   float srcHeight = options.outHeight;//10
   int sampleSize = 1;
   if (srcWidth > reqWidth || srcHeight > reqHeight) {
     int withRatio = Math.round(srcWidth / reqWidth);
     int heightRatio = Math.round(srcHeight / reqHeight);
     sampleSize = Math.min(withRatio, heightRatio);
   }
   return sampleSize;
 }

壓縮比例換算:

float srcWidth = options.outWidth;
float srcHeight = options.outHeight;
float widthScale = outWidth / srcWidth;//目標/原始 寬比例
float heightScale = outHeight / srcHeight; //目標原始 高比
//對比寬高比選擇較大的一種比例
float scale = widthScale > heightScale ? widthScale : heightScale;
float actualOutWidth = srcWidth;
float actualOutHeight = srcHeight;
if (scale < 1) {
  actualOutWidth = srcWidth * scale;
  actualOutHeight = srcHeight * scale;
}

設置縮放比例--生成新的位圖

  Matrix matrix1 = new Matrix();
  matrix1.postScale(scale, scale);// 放大縮小比例
  //生成最終輸出的bitmap
  Bitmap actualOutBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix1, true);

  if (actualOutBitmap != scaledBitmap) {
    scaledBitmap.recycle();
    scaledBitmap = null;
    System.gc();
  }

參考:https://github.com/guizhigang/LGImageCompressor

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

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

AI

应城市| 平安县| 吴旗县| 沛县| 杭锦旗| 吉林省| 鸡泽县| 财经| 安仁县| 临湘市| 巴青县| 抚顺市| 汉寿县| 右玉县| 防城港市| 新津县| 阿合奇县| 天柱县| 密云县| 罗平县| 锡林郭勒盟| 南漳县| 白玉县| 陕西省| 伊吾县| 泽库县| 吉木乃县| 垣曲县| 台南县| 屏山县| 麻阳| 开平市| 石嘴山市| 娱乐| 曲靖市| 崇信县| 江川县| 阿城市| 徐汇区| 肥乡县| 环江|