<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                12.1 Bitmap的高效加載 在介紹Bitmap的高效加載之前,先說一下如何加載一個Bitmap, Bitmap在Android中指的是一張圖片,可以是png格式也可以是jpg等其他常見的圖片格式。那么如何加載一個圖片呢?BitmapFactory類提供了四類方法:decodeFile、decodeResource、decodeStream和decodeByteArray,分別用于支持從文件系統、資源、輸入流以及字節數組中加載出一個Bitmap對象,其中decodeFile和decodeResource又間接調用了decodeStream方法,這四類方法最終是在Android的底層實現的,對應著BitmapFactory類的幾個native方法。 如何高效地加載Bitmap呢?其實核心思想也很簡單,那就是采用BitmapFactory. Options來加載所需尺寸的圖片。這里假設通過ImageView來顯示圖片,很多時候ImageView并沒有圖片的原始尺寸那么大,這個時候把整個圖片加載進來后再設給ImageView,這顯然是沒必要的,因為ImageView并沒有辦法顯示原始的圖片。通過BitmapFactory.Options就可以按一定的采樣率來加載縮小后的圖片,將縮小后的圖片在ImageView中顯示,這樣就會降低內存占用從而在一定程度上避免OOM,提高了Bitmap加載時的性能。BitmapFactory提供的加載圖片的四類方法都支持BitmapFactory.Options參數,通過它們就可以很方便地對一個圖片進行采樣縮放。 通過BitmapFactory.Options來縮放圖片,主要是用到了它的inSampleSize參數,即采樣率。當inSampleSize為1時,采樣后的圖片大小為圖片的原始大小;當inSampleSize大于1時,比如為2,那么采樣后的圖片其寬/高均為原圖大小的1/2,而像素數為原圖的1/4,其占有的內存大小也為原圖的1/4。拿一張1024×1024像素的圖片來說,假定采用ARGB8888格式存儲,那么它占有的內存為1024×1024×4,即4MB,如果inSampleSize為2,那么采樣后的圖片其內存占用只有512×512×4,即1MB。可以發現采樣率inSampleSize必須是大于1的整數圖片才會有縮小的效果,并且采樣率同時作用于寬/高,這將導致縮放后的圖片大小以采樣率的2次方形式遞減,即縮放比例為1/(inSampleSize的2次方),比如inSampleSize為4,那么縮放比例就是1/16。有一種特殊情況,那就是當inSampleSize小于1時,其作用相當于1,即無縮放效果。另外最新的官方文檔中指出,inSampleSize的取值應該總是為2的指數,比如1、2、4、8、16,等等。如果外界傳遞給系統的inSampleSize不為2的指數,那么系統會向下取整并選擇一個最接近的2的指數來代替,比如3,系統會選擇2來代替,但是經過驗證發現這個結論并非在所有的Android版本上都成立,因此把它當成一個開發建議即可。 考慮以下實際的情況,比如ImageView的大小是100×100像素,而圖片的原始大小為200×200,那么只需將采樣率inSampleSize設為2即可。但是如果圖片大小為200×300呢?這個時候采樣率還應該選擇2,這樣縮放后的圖片大小為100×150像素,仍然是適合ImageView的,如果采樣率為3,那么縮放后的圖片大小就會小于ImageView所期望的大小,這樣圖片就會被拉伸從而導致模糊。 通過采樣率即可有效地加載圖片,那么到底如何獲取采樣率呢?獲取采樣率也很簡單,遵循如下流程: (1)將BitmapFactory.Options的inJustDecodeBounds參數設為true并加載圖片。 (2)從BitmapFactory.Options中取出圖片的原始寬高信息,它們對應于outWidth和outHeight參數。 (3)根據采樣率的規則并結合目標View的所需大小計算出采樣率inSampleSize。 (4)將BitmapFactory.Options的inJustDecodeBounds參數設為false,然后重新加載圖片。 經過上面4個步驟,加載出的圖片就是最終縮放后的圖片,當然也有可能不需要縮放。這里說明一下inJustDecodeBounds參數,當此參數設為true時,BitmapFactory只會解析圖片的原始寬/高信息,并不會去真正地加載圖片,所以這個操作是輕量級的。另外需要注意的是,這個時候BitmapFactory獲取的圖片寬/高信息和圖片的位置以及程序運行的設備有關,比如同一張圖片放在不同的drawable目錄下或者程序運行在不同屏幕密度的設備上,這都可能導致BitmapFactory獲取到不同的結果,之所以會出現這個現象,這和Android的資源加載機制有關,相信讀者平日里肯定有所體會,這里就不再詳細說明了。 將上面的4個流程用程序來實現,就產生了下面的代碼: public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { // First decode with inJustDecodeBounds=true to check dimensions final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(res, resId, options); } public static int calculateInSampleSize( BitmapFactory.Options options, int reqWidth, int reqHeight) { // Raw height and width of image final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; // Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) { inSampleSize *= 2; } } return inSampleSize; } 有了上面的兩個方法,實際使用的時候就很簡單了,比如ImageView所期望的圖片大小為100×100像素,這個時候就可以通過如下方式高效地加載并顯示圖片: mImageView.setImageBitmap( decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100)); 除了BitmapFactory的decodeResource方法,其他三個decode系列的方法也是支持采樣加載的,并且處理方式也是類似的,但是decodeStream方法稍微有點特殊,這個會在后續內容中詳細介紹。通過本節的介紹,讀者應該能很好地掌握這種高效地加載圖片的方法了。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看