亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

淺析KJFrameForAndroid框架如何高效加載Bitmap

2020-04-11 11:47:52
字體:
來源:轉載
供稿:網友

我們在寫Android程序的時候,肯定會用到很多圖片。那么對于圖片的壓縮處理自然是必不可少。為什么要壓縮?我想這個問題不必在強調了,每個人在最初學習Android的時候肯定都會知道這么一個原因:我們編寫的應用程序都是有一個最大內存限制,其中JAVA程序和C程序(NDK調用時)共享這一塊內存大小,程序占用了過高的內存就容易出現OOM(OutOfMemory)異常。至于這個最大內存是多少,我們可以通過調用Runtime.getRuntime().maxMemory()方法驗證一下。

正因為受到內存大小限制這一關鍵原因(其實不止這個原因,我想一張1M的圖片和一張10k的圖片,載入的速度必然也是不同的吧)。 如果你的控件大小只有40*40像素的大小,只是為了顯示一張縮略圖,這時候把一張1024*768像素的圖片完全加載到內存中顯然是不值得的,因此我們都會對圖片做壓縮處理。

BitmapFactory這個類提供了多個方法(decodeByteArray, decodeFile, decodeResource等)用于創建Bitmap對象,我們可以根據圖片的來源選擇合適的方法。然而這些方法會為已經讀取的bitmap分配內存,這時如果是一張非常大的圖片就會導致OOM出現。為此,每一種解析方法都提供了一個BitmapFactory.Options參數,可以通過將這個參數的inJustDecodeBounds屬性設置為true就可以讓解析方法禁止為bitmap分配內存,但是如此設置后BitmapFactory的返回值也不再是一個Bitmap對象,而是null。雖然Bitmap是null了,但是BitmapFactory.Options的outWidth、outHeight和outMimeType屬性都會被賦值。使用這個技巧讓我們可以在加載圖片之前就獲取到圖片的長寬值和類型,從而根據情況對圖片進行壓縮。

BitmapFactory.Options options = new BitmapFactory.Options();  options.inJustDecodeBounds = true;  BitmapFactory.decodeFile(pathName, options); int h = options.outHeight;  int w = options.outWidth;  String type = options.outMimeType;

那么知道了圖片的寬高,要如何壓縮呢?BitmapFactory.Options有一個inSampleSize屬性,這個int值表示圖片的原寬高變為1/inSampleSize倍,如果原圖是1024*768,inSampleSize=2,那么壓縮后圖片就變成了512*384。 最后將BitmapFactory.Options設置合適的inSampleSize值,并且記得將inJustDecodeBounds設置回false,再調用一次BitmapFactory相應的創建Bitmap的方法,并把Options傳入,就可以得到壓縮后的圖片了。

這里有一個節選自開源Android應用開發框架KJFrameForAndroid中的一段代碼

/** * 圖片壓縮處理(使用Options的方法) *  * @使用方法 首先你要將Options的inJustDecodeBounds屬性設置為true,BitmapFactory.decode一次圖片。 *  然后將Options連同期望的寬度和高度一起傳遞到到本方法中。 *  之后再使用本方法的返回值做參數調用BitmapFactory.decode創建圖片。 *  * @explain BitmapFactory創建bitmap會嘗試為已經構建的bitmap分配內存 * ,這時就會很容易導致OOM出現。為此每一種創建方法都提供了一個可選的Options參數 * ,將這個參數的inJustDecodeBounds屬性設置為true就可以讓解析方法禁止為bitmap分配內存 * ,返回值也不再是一個Bitmap對象, 而是null。雖然Bitmap是null了,但是Options的outWidth、 * outHeight和outMimeType屬性都會被賦值。 * @param reqWidth *  目標寬度 * @param reqHeight *  目標高度 */  public static BitmapFactory.Options calculateInSampleSize(   final 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;   }   // 設置壓縮比例   options.inSampleSize = inSampleSize;   options.inJustDecodeBounds = false;   return options;  }

以上的方法適合使用在讀取一個未知來源的圖片時使用,因為你不知道這個未知來源圖片的大小,那么還有一種方法是用在已經載入內存的圖片,對已經載入內存的圖片做壓縮以后重新保存到本地,從而可以把一張原本1M大小的圖片變成一張10K的圖片。

這種方法的核心思想是首先將圖片轉成一個輸出流,并記錄輸出流的byte數組大小,通過調用bitmap對象的compress方法,對圖片做一次壓縮以及格式化,并將byte數組大小與期望壓縮的目標大小比對,得出壓縮比率,并調用Bitmap的縮放方法,縮放計算出的壓縮比率,從而得到壓縮后的方法。

下面我們繼續來看KJFrameForAndroid框架中的另一段代碼:

/**  * 圖片壓縮方法:(使用compress的方法)  *   * @explain 如果bitmap本身的大小小于maxSize,則不作處理  * @param bitmap  *  要壓縮的圖片  * @param maxSize  *  壓縮后的大小,單位kb  */ public static void imageZoom(Bitmap bitmap, double maxSize) {  // 將bitmap放至數組中,意在獲得bitmap的大?。ㄅc實際讀取的原文件要大)  ByteArrayOutputStream baos = new ByteArrayOutputStream();  // 格式、質量、輸出流  bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);  byte[] b = baos.toByteArray();  // 將字節換成KB  double mid = b.length / 1024;  // 獲取bitmap大小 是允許最大大小的多少倍  double i = mid / maxSize;  // 判斷bitmap占用空間是否大于允許最大空間 如果大于則壓縮 小于則不壓縮  if (i > 1) {   // 縮放圖片 此處用到平方根 將寬帶和高度壓縮掉對應的平方根倍   // (保持寬高不變,縮放后也達到了最大占用空間的大?。?  bitmap = scale(bitmap, bitmap.getWidth() / Math.sqrt(i),     bitmap.getHeight() / Math.sqrt(i));  } }/***  * 圖片的縮放方法  *   * @param src  *  :源圖片資源  * @param newWidth  *  :縮放后寬度  * @param newHeight  *  :縮放后高度  */ public static Bitmap scale(Bitmap src, double newWidth, double newHeight) {  // 記錄src的寬高  float width = src.getWidth();  float height = src.getHeight();  // 創建一個matrix容器  Matrix matrix = new Matrix();  // 計算縮放比例  float scaleWidth = ((float) newWidth) / width;  float scaleHeight = ((float) newHeight) / height;  // 開始縮放  matrix.postScale(scaleWidth, scaleHeight);  // 創建縮放后的圖片  return Bitmap.createBitmap(src, 0, 0, (int) width, (int) height,    matrix, true); }

另外附上KJFrameForAndroid框架項目地址: https://github.com/kymjs/KJFrameForAndroid

或備用地址 http://git.oschina.net/kymjs/KJFrameForAndroid

有這方面需要的朋友可以下載下來自己研究下

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美日韩最新| 日本道色综合久久影院| 欧美在线欧美在线| 久久久爽爽爽美女图片| 午夜精品99久久免费| 亚洲黄色www| 57pao成人永久免费视频| 91极品女神在线| 性欧美xxxx| 亚洲精品一区二区网址| 伊人精品在线观看| 欧美日本中文字幕| 日韩电影在线观看中文字幕| 精品国产31久久久久久| 日韩午夜在线视频| 2021久久精品国产99国产精品| 美女啪啪无遮挡免费久久网站| 538国产精品一区二区免费视频| 国产成人久久久精品一区| 亚洲成人精品av| 亚洲色图第三页| 欧美亚洲国产精品| 欧美电影《睫毛膏》| 少妇高潮久久久久久潘金莲| 91精品国产自产在线观看永久| 在线观看精品自拍私拍| 亚洲国产精品久久久久| 国产91精品网站| 欧美日本啪啪无遮挡网站| 精品无人区乱码1区2区3区在线| 福利一区视频在线观看| 日韩激情第一页| 欧美最猛性xxxxx(亚洲精品)| 久久久精品在线观看| 亚洲成人aaa| 欧美精品在线免费| 57pao成人国产永久免费| 亚洲欧美日韩直播| 久久久av一区| 国产精品劲爆视频| 日韩精品中文字幕久久臀| 都市激情亚洲色图| 久久久亚洲网站| 国模极品一区二区三区| 欧美另类暴力丝袜| 欧美在线一区二区视频| 日韩免费在线看| 国产69精品久久久久9| 国产在线高清精品| 最近中文字幕mv在线一区二区三区四区| 亚洲精品综合久久中文字幕| 538国产精品一区二区在线| 日韩在线视频观看正片免费网站| 欧美第一淫aaasss性| 日本aⅴ大伊香蕉精品视频| 欧美噜噜久久久xxx| 亚洲va欧美va国产综合久久| 国产精品极品美女在线观看免费| 中文字幕亚洲国产| 91性高湖久久久久久久久_久久99| 日韩欧美亚洲一二三区| 精品日韩美女的视频高清| 国产亚洲欧洲高清| 国产91精品不卡视频| 91亚洲va在线va天堂va国| 欧美中文在线视频| 高清欧美性猛交xxxx黑人猛交| 日韩女优人人人人射在线视频| 久久久久亚洲精品| 久久久99免费视频| 97热在线精品视频在线观看| 992tv在线成人免费观看| 91色在线观看| 亚洲午夜性刺激影院| 亚洲精品美女视频| 正在播放国产一区| 日韩中文字幕国产精品| 欧美另类老女人| 日韩激情第一页| 丁香五六月婷婷久久激情| 久久精品中文字幕免费mv| 国产精品吊钟奶在线| 7m精品福利视频导航| 色一情一乱一区二区| 国产偷国产偷亚洲清高网站| 91精品中文在线| 少妇精69xxtheporn| 性金发美女69hd大尺寸| 欧美日韩精品在线视频| 国产精品一区二区久久久| 成人国产精品av| 在线观看成人黄色| 成人97在线观看视频| 日韩视频免费大全中文字幕| 国产精品人成电影在线观看| 久久久久国产精品免费网站| 欧美视频在线视频| 91精品久久久久久久久中文字幕| 午夜免费日韩视频| 国产美女直播视频一区| 91色琪琪电影亚洲精品久久| 国产亚洲a∨片在线观看| 日韩精品久久久久| 亚洲欧美日韩直播| 国产精品视频自在线| 欧美黄色免费网站| 国产97人人超碰caoprom| 国产精品情侣自拍| 亚洲欧美一区二区三区在线| 5278欧美一区二区三区| 777777777亚洲妇女| 成人a级免费视频| 色妞一区二区三区| 色无极影院亚洲| 亚洲乱码av中文一区二区| 色综合天天狠天天透天天伊人| 欧美高清视频在线| 色黄久久久久久| 亚洲色图50p| 亚洲欧美日韩精品久久奇米色影视| 亚洲黄色片网站| 国产一区二区三区在线播放免费观看| 久久久久女教师免费一区| 亚洲japanese制服美女| 国产欧美精品一区二区| 国产91在线播放九色快色| 国产午夜精品视频免费不卡69堂| 中文字幕视频一区二区在线有码| 丝袜亚洲欧美日韩综合| 最新的欧美黄色| 激情成人中文字幕| 亚洲福利视频免费观看| 久久久国产一区二区三区| 成人网址在线观看| www.日韩不卡电影av| 国产精品国产三级国产aⅴ9色| 国内偷自视频区视频综合| 精品中文字幕在线2019| 亚洲视频在线观看免费| 欧洲中文字幕国产精品| 国产精品99久久99久久久二8| 久久视频在线视频| 91九色单男在线观看| 国产成人精品视频在线观看| 麻豆一区二区在线观看| 国产精品美女久久久久久免费| 国产黑人绿帽在线第一区| 国产亚洲欧洲黄色| 欧美日韩国产精品| 日韩中文字幕在线免费观看| 久久成人国产精品| 久久精视频免费在线久久完整在线看| www国产精品com| 国产丝袜一区视频在线观看| 欧美中文在线观看国产| 啊v视频在线一区二区三区| 日韩在线中文视频| 久久伊人免费视频| 国语对白做受69| 国产偷亚洲偷欧美偷精品| 555www成人网| 91av在线网站| 国产精品永久在线| 亚洲大胆人体视频|