欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android圖片壓縮的實例詳解

 更新時間:2017年08月18日 09:57:25   投稿:lqh  
這篇文章主要介紹了Android圖片壓縮的實例詳解的相關(guān)資料,android圖片壓縮主要有兩種方式:壓縮圖片分辨率與壓縮圖片質(zhì)量,需要的朋友可以參考下

Android圖片壓縮的實例詳解

在做微信分享的時候,由于分享的縮略圖要求不得大于32K,否則不能調(diào)起微信,所以總結(jié)了一下Android圖片的壓縮問題,大部分資料都是來自網(wǎng)上各位的分享,自己只是完善或修改了一下,本著繼續(xù)分享的精神,也方便自己記憶,于是總結(jié)如下。

android圖片壓縮主要有兩種方式:1.壓縮圖片分辨率 2.壓縮圖片質(zhì)量

一、先看壓縮圖片分辨率,很好理解,如本來1280*768的圖片壓縮為640*384大小。廢話不說,直接上代碼:



/** 
   * 按比例壓縮圖片分辨率 
   * @param inBitmap 
   * @param outHeight 輸出圖片高度,可據(jù)此保持比例計算輸出寬度 
   * @param needRecycled 是否回收inBitmap 
   * @return 
   */ 
  public static Bitmap createScaledBitmapByOutHeight(Bitmap inBitmap, int outHeight, boolean needRecycled) {      
    int bitmapHeight = inBitmap.getHeight(); 
    int bitmapWidth = inBitmap.getWidth(); 
    int outWidth = bitmapWidth * outHeight / bitmapHeight; 
     
    return createScaledBitmap(inBitmap, outWidth, outHeight, needRecycled); 
  }  
   
  /** 
   * 按比例壓縮圖片分辨率 
   * @param inBitmap 
   * @param outHeight 輸出圖片寬度,可據(jù)此保持比例計算輸出高度 
   * @param needRecycled 是否回收inBitmap 
   * @return 
   */ 
  public static Bitmap createScaledBitmapByOutWidth(Bitmap inBitmap, int outWidth, boolean needRecycled) {     
    int bitmapHeight = inBitmap.getHeight(); 
    int bitmapWidth = inBitmap.getWidth(); 
    int outHeight = bitmapHeight * outWidth / bitmapWidth; 
     
    return createScaledBitmap(inBitmap, outWidth, outHeight, needRecycled); 
  } 
   
  /** 
   * 指定輸出的寬高縮放圖片 
   * @param inBitmap 
   * @param outWidth 
   * @param outHeight 
   * @param needRecycled 
   * @return 
   */ 
  public static Bitmap createScaledBitmap(Bitmap inBitmap, int outWidth, int outHeight, boolean needRecycled) {         
     
    Bitmap thumbBmp = Bitmap.createScaledBitmap(inBitmap, outWidth, outHeight, true); 
    if (needRecycled) { 
      inBitmap.recycle(); 
    } 
     
    return thumbBmp; 
  } 

前兩個方法可以指定期望的寬度或高度,并按比例縮放圖片的分辨率,第3個方法可以隨意指定期望的寬高,縮放圖片。

上面代碼是對輸入的bitmap進行縮放,還可以從資源或文件中加載圖片并縮放,具體如下:

/** 
   * 從資源加載并壓縮圖片 
   * @param res 
   * @param resId 
   * @param outWidth 目標寬度 
   * @param outHeight 目標高度 
   * @return 
   */ 
  public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,  
      int outWidth, int outHeight) {  
    final BitmapFactory.Options options = new BitmapFactory.Options();  
    options.inJustDecodeBounds = true; // 假解,來獲取圖片大小  
    BitmapFactory.decodeResource(res, resId, options);  
    options.inSampleSize = calculateInSampleSize(options, outWidth, outHeight);  
    // 使用獲取到的inSampleSize值再次解析圖片  
    options.inJustDecodeBounds = false; 
    //options.inPreferredConfig = Config.RGB_565; 
    return BitmapFactory.decodeResource(res, resId, options);  
  }  
   
  /** 
   * 從文件中加載并壓縮圖片 
   * @param res 
   * @param resId 
   * @param outWidth 目標寬度 
   * @param outHeight 目標高度 
   * @return 
   */ 
  public static Bitmap decodeSampledBitmapFromFile(String pathName, int outWidth, int outHeight) { 
    final BitmapFactory.Options options = new BitmapFactory.Options();  
    options.inJustDecodeBounds = true; // 假解,來獲取圖片大小  
    BitmapFactory.decodeFile(pathName, options); 
    options.inSampleSize = calculateInSampleSize(options, outWidth, outHeight);  
    // 使用獲取到的inSampleSize值再次解析圖片  
    options.inJustDecodeBounds = false; 
    //options.inPreferredConfig = Config.RGB_565; 
    return BitmapFactory.decodeFile(pathName, options); 
  }  
   
  /** 
   * 計算options.inSampleSize 
   * @param options 
   * @param reqWidth 
   * @param reqHeight 
   * @return 
   */ 
  public static int calculateInSampleSize(BitmapFactory.Options options,  
      int reqWidth, int reqHeight) {  
    // 源圖片的高度和寬度  
    final int height = options.outHeight;  
    final int width = options.outWidth;  
    int inSampleSize = 1;  
    if (height > reqHeight || width > reqWidth) {  
      // 計算出實際寬高和目標寬高的比率  
      final int heightRatio = Math.round((float) height / (float) reqHeight);  
      final int widthRatio = Math.round((float) width / (float) reqWidth);  
      // 選擇寬和高中最小的比率作為inSampleSize的值,這樣可以保證最終圖片的寬和高  
      // 一定都會大于等于目標的寬和高。  
      inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;  
    }  
    return inSampleSize;  
  }  

二、壓縮圖片的質(zhì)量

/** 
   * 壓縮圖片質(zhì)量,把圖片壓縮到outSize以內(nèi) 
   * @param inBitmap 原始bitmap 
   * @param outSize 壓縮到的大小 
   * @param needRecycled 是否回收bitmap 
   * @return 
   */ 
  public static Bitmap compressImage(Bitmap inBitmap, int outSize, boolean needRecycled) {  
      
    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    inBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
    int quality = 100;  
    while (baos.toByteArray().length / 1024 > outSize) { 
      if (quality <= 0) { 
        ByteArrayInputStream outBais = new ByteArrayInputStream(baos.toByteArray()); 
        return BitmapFactory.decodeStream(outBais, null, null);// 如果quaLity為0時還未達到32k以內(nèi),返回得到的最小值;如需要可結(jié)合分辨率壓縮 
      } 
      baos.reset(); 
      //PNG格式下,這種壓縮不起作用(quality:0-100,如果目標大小太小,有時候質(zhì)量壓縮不一定能達到效果,需結(jié)合分辨率壓縮) 
      inBitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos); 
      Log.e("AN", "bitmap size:"+ baos.toByteArray().length / 1024 + "k"); 
      quality -= 10; 
    } 
    if (needRecycled) { 
      inBitmap.recycle(); 
    } 
     
     
    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 
    Bitmap outBitmap= BitmapFactory.decodeStream(bais, null, null);//ByteArrayInputStream轉(zhuǎn)成bitmap 
     
    return outBitmap;  
  } 


需要注意的是compress方法,該壓縮方法只對JPEG格式有效,對于PNG格式,則會忽略第二個參數(shù)quality,即壓縮不起作用。這種壓縮只是對圖片質(zhì)量有影響,并不會改變圖片大小。

當然,如有需要,以上兩種壓縮方法可以結(jié)合使用。

以上就是Android 圖片壓縮的實現(xiàn)方法的詳解,如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • Android實現(xiàn)Service獲取當前位置(GPS+基站)的方法

    Android實現(xiàn)Service獲取當前位置(GPS+基站)的方法

    這篇文章主要介紹了Android實現(xiàn)Service獲取當前位置(GPS+基站)的方法,較為詳細的分析了Service基于GPS位置的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • Android中簡單的電話管理與短信管理App編寫實例

    Android中簡單的電話管理與短信管理App編寫實例

    這篇文章主要介紹了Android中簡單的電話管理與短信管理App編寫實例,包括監(jiān)聽電話的呼叫狀態(tài)以及短信群發(fā)聯(lián)系人選擇等基本功能的實現(xiàn),代碼突出要點,需要的朋友可以參考下
    2016-04-04
  • Android編程獲取網(wǎng)絡(luò)連接方式及判斷手機卡所屬運營商的方法

    Android編程獲取網(wǎng)絡(luò)連接方式及判斷手機卡所屬運營商的方法

    這篇文章主要介紹了Android編程獲取網(wǎng)絡(luò)連接方式及判斷手機卡所屬運營商的方法,涉及Android針對網(wǎng)絡(luò)的判斷及本機信息的獲取技巧,需要的朋友可以參考下
    2016-01-01
  • Android中沒有插入SD情況下的文件寫入和讀取方法

    Android中沒有插入SD情況下的文件寫入和讀取方法

    在Android開發(fā)時會遇到如下一種場合希望應(yīng)用下載到當前應(yīng)用的根目錄下,而非SD卡中然后可以隨時被該應(yīng)用或其他應(yīng)用訪問這個文件,即具有被全局讀取的權(quán)限
    2012-11-11
  • Android文字匹配度算法及實際應(yīng)用示例

    Android文字匹配度算法及實際應(yīng)用示例

    本文介紹了Android應(yīng)用中常用的文字匹配度算法Levenshtein Distance,并給出了實際應(yīng)用示例,通過合理選擇和應(yīng)用文字匹配度算法,可以實現(xiàn)多種功能,提升用戶體驗,增強應(yīng)用的實用性,需要的朋友可以參考下
    2024-05-05
  • AndroidStudio集成OpenCV的實現(xiàn)教程

    AndroidStudio集成OpenCV的實現(xiàn)教程

    本文主要介紹了Android?Studio集成OpenCV的實現(xiàn)教程,文中通過圖文介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 從Cocos2d-x2遷移到Cocos2d-x3的過程分享

    從Cocos2d-x2遷移到Cocos2d-x3的過程分享

    Cocos2d-x 3.0發(fā)布沒多久,我就迫不及待地將手頭的一個習作嘗試從2.2.2版本遷移到3.0rc0引擎上,本問介紹了遷移流程和遇到的問題,以及發(fā)現(xiàn)了針對Android平臺的變動,需要的朋友可以參考下
    2014-04-04
  • AndroidStudio插件GsonFormat之Json快速轉(zhuǎn)換JavaBean教程

    AndroidStudio插件GsonFormat之Json快速轉(zhuǎn)換JavaBean教程

    這篇文章主要介紹了AndroidStudio插件GsonFormat之Json快速轉(zhuǎn)換JavaBean教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 簡單談?wù)刟ndroid studio 的單元測試

    簡單談?wù)刟ndroid studio 的單元測試

    昨天在完善項目的時候,需要進行單元測試,在Eclipse環(huán)境中進行是很簡單的,但是在Android Studio環(huán)境中進行單元測試,在國內(nèi)找了很多資料,大都是人云亦云,本文發(fā)布出來供大家學習參考。
    2016-08-08
  • Android編程之匿名內(nèi)部類與回調(diào)函數(shù)用法分析

    Android編程之匿名內(nèi)部類與回調(diào)函數(shù)用法分析

    這篇文章主要介紹了Android編程之匿名內(nèi)部類與回調(diào)函數(shù)用法,結(jié)合實例形式分析了Android編程中所涉及的java匿名內(nèi)部類與回調(diào)函數(shù)的概念、定義、使用方法與相關(guān)注意事項,需要的朋友可以參考下
    2016-10-10

最新評論