欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Android應(yīng)用中怎么對圖片進(jìn)行壓縮

Android應(yīng)用中怎么對圖片進(jìn)行壓縮?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

創(chuàng)新互聯(lián)公司是一家專業(yè)提供烏爾禾企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、html5、小程序制作等業(yè)務(wù)。10年已為烏爾禾眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

為何要壓縮

1、體積的原因

如果你的圖片是要準(zhǔn)備上傳的,那動輒幾M的大小肯定不行的,況且圖片分辨率大于設(shè)備分辨率的話毫無意義。

2、內(nèi)存原因

如果圖片要顯示下Android設(shè)備上,ImageView最終是要加載Bitmap對象的,就要考慮單個Bitmap對象的內(nèi)存占用了,如何計算一張圖片的加載到內(nèi)存的占用呢?其實(shí)就是所有像素的內(nèi)存占用總和:

bitmap內(nèi)存大小 = 圖片長度 x 圖片寬度 x 單位像素占用的字節(jié)數(shù)

起決定因素就是最后那個參數(shù)了,Bitmap'常見有2種編碼方式:ARGB_8888和RGB_565,ARGB_8888每個像素點(diǎn)4個byte,RGB_565是2個byte,一般都采用ARGB_8888這種。那么常見的1080*1920的圖片內(nèi)存占用就是:

1920 x 1080 x 4 = 7.9M

壓縮原理

從上面可以總結(jié)出,圖片壓縮應(yīng)該從兩個方面入手同時進(jìn)行:先是降低分辨率,然后降低每個像素的質(zhì)量也就是內(nèi)存占用。

分辨率壓縮

假設(shè)有張原圖是3840x2400,我想壓縮成1920x1080,實(shí)際是不可能100%能壓縮這個值的。因為圖片壓縮要保證寬高比,試想一下800x100的橫向圖可能壓成20x200豎向圖嗎? 不可能的.。這里常見的算法就是在1920x1080的范圍內(nèi)保證較短邊,然后按照比例壓縮整個圖:

這里原圖的寬高比是 3840/2400 = 1.6,目標(biāo)圖的寬高比是1920/1080 = 1.78>1.6,較短邊是高。所以就應(yīng)該按照高的比例來壓縮。

2400/1080=2.22,這樣真實(shí)目標(biāo)值就是:1728x1080,壓縮比四舍五入是:2,然后通過下面代碼進(jìn)行壓縮:

 private Bitmap compressPixel(String filePath){
  Bitmap bmp = null;
  BitmapFactory.Options options = new BitmapFactory.Options();
  //setting inSampleSize value allows to load a scaled down version of the original image
  options.inSampleSize = 2;

  //inJustDecodeBounds set to false to load the actual bitmap
  options.inJustDecodeBounds = false;
  options.inTempStorage = new byte[16 * 1024];
  try {
   //load the bitmap from its path
   bmp = BitmapFactory.decodeFile(filePath, options);
   if (bmp == null) {

    InputStream inputStream = null;
    try {
     inputStream = new FileInputStream(filePath);
     BitmapFactory.decodeStream(inputStream, null, options);
     inputStream.close();
    } catch (FileNotFoundException exception) {
     exception.printStackTrace();
    } catch (IOException exception) {
     exception.printStackTrace();
    }
   }
  } catch (OutOfMemoryError exception) {
   exception.printStackTrace();
  }finally {
   return bmp;
  }
 }

看起來沒什么問題,看看實(shí)測結(jié)果,原圖 3840*2400,大小2.2M,我選4個分辨率當(dāng)做目標(biāo)值來壓縮:

Android應(yīng)用中怎么對圖片進(jìn)行壓縮

可以看出壓縮后的4張圖沒有一張達(dá)到目標(biāo)值,而且偏差較大,原因就是options.inSampleSize這個屬性,他只能是2的N次方,如果算出來是7,Android會取近似值8,以此類推導(dǎo)致這個值不能壓縮到目標(biāo)值。看了一下Compressor這個開源庫他對此做了處理,把壓縮后的圖片在Canvas上面按照目標(biāo)尺寸重繪,得到一個新的bitmap:

核心代碼:

Matrix scaleMatrix = new Matrix();
  scaleMatrix.setScale(ratioX, ratioY, 0, 0);

  Canvas canvas = new Canvas(scaledBitmap);
  canvas.setMatrix(scaleMatrix);
  canvas.drawBitmap(bmp, 0, 0, new Paint(Paint.FILTER_BITMAP_FLAG));

用Compressor開源庫壓縮的圖片對比下:

Android應(yīng)用中怎么對圖片進(jìn)行壓縮

可以看出每次都能壓縮到真實(shí)目標(biāo)值。(注意不是目標(biāo)值,注意區(qū)分目標(biāo)值和真實(shí)目標(biāo)值)

質(zhì)量壓縮

Bitmap有個方法 compress(CompressFormat format, int quality, OutputStream stream),quality就是壓縮質(zhì)量傳入0-100,數(shù)值越小壓縮的越厲害。

不過我們一般不直接設(shè)置這個數(shù)值,而是自定義一個壓縮后大小比如300KB,然后動態(tài)計算這個quality,核心代碼:

//進(jìn)行有損壓縮
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int options_ = 100;
actualOutBitmap.compress(Bitmap.CompressFormat.JPEG, options_, baos);
//質(zhì)量壓縮方法,把壓縮后的數(shù)據(jù)存放到baos中 (100表示不壓縮,0表示壓縮到最小)
int baosLength = baos.toByteArray().length;
while (baosLength / 1024 > maxFileSize)
 {
//循環(huán)判斷如果壓縮后圖片是否大于maxMemmorrySize,大于繼續(xù)壓縮 
baos.reset();
//重置baos即讓下一次的寫入覆蓋之前的內(nèi)容
 options_ = Math.max(0, options_ - 10);//圖片質(zhì)量每次減少10
 actualOutBitmap.compress(Bitmap.CompressFormat.JPEG, options_, baos);
//將壓縮后的圖片保存到baos中 
baosLength = baos.toByteArray().length;
 if (options_ == 0)//如果圖片的質(zhì)量已降到最低則,不再進(jìn)行壓縮 
break;
}

看完上述內(nèi)容,你們掌握Android應(yīng)用中怎么對圖片進(jìn)行壓縮的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

當(dāng)前名稱:Android應(yīng)用中怎么對圖片進(jìn)行壓縮
文章出自:http://aaarwkj.com/article36/gdecpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、定制開發(fā)ChatGPT、用戶體驗、品牌網(wǎng)站設(shè)計、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
av第一福利大全导航| 国产成人精品视频午夜蜜蜂| 青青草免费在线视频视频| 精品一区二区久久久久久网精| 亚洲国产精品中文字幕一区久久 | 久久好大好爽要死了欧美| 中文字幕亚洲精品视频| 91黑丝国产在线播放| 久久免费看少妇高潮av| 91成人国产综合久久精品| 欧美精品久久久久九九九| 久久综合婷婷亚洲五月| 国产精品久久久99| 午夜日本大胆裸体艺术| 国产精品青青草原在线| 人妖系列中文字幕欧美系列| 国产无遮挡又黄又爽网站| 日本韩国国语对白一区二区三区| 久久精品国产亚洲av不卡| 国产黄色片网站在线看| 成人激情视频在线观看| 免费在线观看日韩av大片| 国产在线精品91国自产拍| 人人爽久久爱夜夜躁一区| 国产亚洲精品精品国产亚洲| 天天免费日日夜夜夜夜| 日本中文字幕在线播放一区| 亚洲一区二区三区无人区| 国产高清av免费观看| 国产亚洲综合一区二区三区| 国内揄拍国内精品少妇国| 色播婷婷午夜激情福利| 日韩精品在线观看视频一区二区三区| 日韩国产人妻一区二区 | 免费观看黄片视频在线播放 | 少妇太爽高潮在线播放| 欧美黑人少妇高潮喷水| 91九色在线porny| 老熟妇仑乱换频一区二区| 国产一区二区爽爽爽视频| 国产av一区二区三区日韩接吻|