成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

KJFrameForAndroid框架學(xué)習(xí)----高效加載Bitmap

移動開發(fā) Android
們在寫Android程序的時候,肯定會用到很多圖片。那么對于圖片的壓縮處理自然是必不可少。為什么要壓縮?我想這個問題不必在強(qiáng)調(diào)了,每個人在最初 學(xué)習(xí)Android的時候肯定都會知道這么一個原因:我們編寫的應(yīng)用程序都是有一個最大內(nèi)存限制.

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

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

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

 

  1. BitmapFactory.Options options = new BitmapFactory.Options();   
  2.     options.inJustDecodeBounds = true;   
  3.     BitmapFactory.decodeFile(pathName, options); 
  4.     int h = options.outHeight;   
  5.     int w = options.outWidth;   
  6.     String type = options.outMimeType; 

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

這里有一個節(jié)選自開源Android應(yīng)用開發(fā)框架KJFrameForAndroid中的一段代碼

 

  1. /** 
  2.      * 圖片壓縮處理(使用Options的方法) 
  3.      *  
  4.      * @使用方法 首先你要將Options的inJustDecodeBounds屬性設(shè)置為true,BitmapFactory.decode一次圖片。 
  5.      *       然后將Options連同期望的寬度和高度一起傳遞到到本方法中。 
  6.      *       之后再使用本方法的返回值做參數(shù)調(diào)用BitmapFactory.decode創(chuàng)建圖片。 
  7.      *  
  8.      * @explain BitmapFactory創(chuàng)建bitmap會嘗試為已經(jīng)構(gòu)建的bitmap分配內(nèi)存 
  9.      *          ,這時就會很容易導(dǎo)致OOM出現(xiàn)。為此每一種創(chuàng)建方法都提供了一個可選的Options參數(shù) 
  10.      *          ,將這個參數(shù)的inJustDecodeBounds屬性設(shè)置為true就可以讓解析方法禁止為bitmap分配內(nèi)存 
  11.      *          ,返回值也不再是一個Bitmap對象, 而是null。雖然Bitmap是null了,但是Options的outWidth、 
  12.      *          outHeight和outMimeType屬性都會被賦值。 
  13.      * @param reqWidth 
  14.      *            目標(biāo)寬度 
  15.      * @param reqHeight 
  16.      *            目標(biāo)高度 
  17.      */ 
  18.     public static BitmapFactory.Options calculateInSampleSize( 
  19.             final BitmapFactory.Options options, int reqWidth, int reqHeight) { 
  20.         // 源圖片的高度和寬度 
  21.         final int height = options.outHeight; 
  22.         final int width = options.outWidth; 
  23.         int inSampleSize = 1
  24.         if (height > reqHeight || width > reqWidth) { 
  25.             // 計算出實際寬高和目標(biāo)寬高的比率 
  26.             final int heightRatio = Math.round((float) height 
  27.                     / (float) reqHeight); 
  28.             final int widthRatio = Math.round((float) width / (float) reqWidth); 
  29.             // 選擇寬和高中最小的比率作為inSampleSize的值,這樣可以保證最終圖片的寬和高 
  30.             // 一定都會大于等于目標(biāo)的寬和高。 
  31.             inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 
  32.         } 
  33.         // 設(shè)置壓縮比例 
  34.         options.inSampleSize = inSampleSize; 
  35.         options.inJustDecodeBounds = false
  36.         return options; 
  37.     } 

以上的方法適合使用在讀取一個未知來源的圖片時使用,因為你不知道這個未知來源圖片的大小,那么還有一種方法是用在已經(jīng)載入內(nèi)存的圖片,對已經(jīng)載入內(nèi)存的圖片做壓縮以后重新保存到本地,從而可以把一張原本1M大小的圖片變成一張10K的圖片。
這 種方法的核心思想是首先將圖片轉(zhuǎn)成一個輸出流,并記錄輸出流的byte數(shù)組大小,通過調(diào)用bitmap對象的compress方法,對圖片做一次壓縮以及 格式化,并將byte數(shù)組大小與期望壓縮的目標(biāo)大小比對,得出壓縮比率,并調(diào)用Bitmap的縮放方法,縮放計算出的壓縮比率,從而得到壓縮后的方法。
下面我們繼續(xù)來看KJFrameForAndroid框架中的另一段代碼:

 

  1. /** 
  2.      * 圖片壓縮方法:(使用compress的方法) 
  3.      *  
  4.      * @explain 如果bitmap本身的大小小于maxSize,則不作處理 
  5.      * @param bitmap 
  6.      *            要壓縮的圖片 
  7.      * @param maxSize 
  8.      *            壓縮后的大小,單位kb 
  9.      */ 
  10.     public static void imageZoom(Bitmap bitmap, double maxSize) { 
  11.         // 將bitmap放至數(shù)組中,意在獲得bitmap的大小(與實際讀取的原文件要大) 
  12.         ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
  13.         // 格式、質(zhì)量、輸出流 
  14.         bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
  15.         byte[] b = baos.toByteArray(); 
  16.         // 將字節(jié)換成KB 
  17.         double mid = b.length / 1024
  18.         // 獲取bitmap大小 是允許最大大小的多少倍 
  19.         double i = mid / maxSize; 
  20.         // 判斷bitmap占用空間是否大于允許最大空間 如果大于則壓縮 小于則不壓縮 
  21.         if (i > 1) { 
  22.             // 縮放圖片 此處用到平方根 將寬帶和高度壓縮掉對應(yīng)的平方根倍 
  23.             // (保持寬高不變,縮放后也達(dá)到了最大占用空間的大小) 
  24.             bitmap = scale(bitmap, bitmap.getWidth() / Math.sqrt(i), 
  25.                     bitmap.getHeight() / Math.sqrt(i)); 
  26.         } 
  27.     } 
  28. /*** 
  29.      * 圖片的縮放方法 
  30.      *  
  31.      * @param src 
  32.      *            :源圖片資源 
  33.      * @param newWidth 
  34.      *            :縮放后寬度 
  35.      * @param newHeight 
  36.      *            :縮放后高度 
  37.      */ 
  38.     public static Bitmap scale(Bitmap src, double newWidth, double newHeight) { 
  39.         // 記錄src的寬高 
  40.         float width = src.getWidth(); 
  41.         float height = src.getHeight(); 
  42.         // 創(chuàng)建一個matrix容器 
  43.         Matrix matrix = new Matrix(); 
  44.         // 計算縮放比例 
  45.         float scaleWidth = ((float) newWidth) / width; 
  46.         float scaleHeight = ((float) newHeight) / height; 
  47.         // 開始縮放 
  48.         matrix.postScale(scaleWidth, scaleHeight); 
  49.         // 創(chuàng)建縮放后的圖片 
  50.         return Bitmap.createBitmap(src, 00, (int) width, (int) height, 
  51.                 matrix, true); 
  52.     } 

 本文鏈接:http://my.oschina.net/kymjs/blog/292174

責(zé)任編輯:chenqingxiang 來源: oschina
相關(guān)推薦

2014-08-29 09:54:46

KJFrameForA

2020-09-08 06:28:42

大數(shù)據(jù)應(yīng)用

2021-11-15 10:00:22

模型人工智能NLP

2016-12-02 20:43:34

Android動態(tài)加載DL框架

2011-04-13 11:38:09

Mockito

2025-01-27 00:54:31

2017-05-05 09:45:13

編程語言學(xué)習(xí)代碼

2009-09-28 10:40:28

.NET學(xué)習(xí)

2009-08-06 18:06:33

WebMethod框架

2015-09-17 10:23:04

新技術(shù)學(xué)習(xí)

2015-09-17 08:55:47

react學(xué)習(xí)技術(shù)

2015-04-16 10:41:34

Bitmap

2025-01-26 09:07:46

2020-06-05 14:49:51

強(qiáng)化學(xué)習(xí)算法框架

2019-11-14 09:00:00

前端測試工具框架

2009-10-27 10:28:33

Silverlight

2023-09-13 11:40:12

2023-09-12 16:20:04

邊緣AI深度學(xué)習(xí)

2014-07-18 14:03:06

Android高效編寫代碼

2015-12-24 10:13:29

JavaExecutor框架
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩欧美不卡 | 红色av社区| 欧美日韩黄 | 精品久久久久久久久久久久久 | 久久精品久久久久久 | 成人毛片一区二区三区 | 99这里只有精品视频 | 成人免费毛片在线观看 | 中文字幕一区在线观看视频 | 成人高清网站 | 国产情品 | 91精品国产91 | 亚洲一区二区三区免费在线观看 | 国产乱码精品1区2区3区 | 亚洲国产成人久久久 | 国产精品国产三级国产aⅴ中文 | 日本三级电影在线免费观看 | 欧美专区日韩 | 看av网| 成人午夜网站 | 国产一区二区三区高清 | 欧美激情国产日韩精品一区18 | 国产99久久精品一区二区永久免费 | 亚洲一区二区在线电影 | 亚洲色视频 | 美女日皮网站 | 日韩一区在线观看视频 | 欧美人妖网站 | 欧美久久久久久 | 国产清纯白嫩初高生在线播放视频 | 成年网站在线观看 | 天天躁日日躁狠狠的躁天龙影院 | 国产亚洲精品精品国产亚洲综合 | 国产激情网 | 99视频免费在线 | 99热首页| 精品欧美一区二区在线观看视频 | 中文字幕亚洲精品 | 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 国产在线精品一区二区三区 | aaaaaaa片毛片免费观看 |