更有效的加载较大的Bitmap
譯文出自谷歌安卓官方:https://developer.android.com/training/displaying-bitmaps/load-bitmap.html#read-bitmap
圖片在大小與形狀上各種各樣。在許多情況下,它們比應用程序中的UI所需要的尺寸都大。例如,手機自帶的相冊會為我們展示
相機所拍攝的圖片,但這些圖片比設備屏幕分辨率高的多。
考慮應用程序內存的限制,理想情況下你只想將低分辨率的圖片加載到內存中。低分辨率的圖片應要求能夠與你所展示的UI大小相同。
高分辨率的圖片不僅無法為你帶來視覺上的好處,而且還會占用你寶貴的內存并引發額外的內存開銷。
本課程將引導你通過加載更小的下采樣的圖片來解碼大的圖片,這樣可以防止超出應用程序的內存限制。
讀取位圖的尺寸與類型
BitmapFactory為創造來自不同來源的Bitmap提供了一些解碼方法,如decodeByteArray(),decodeFile(),decodeResource()等。你要通過你的圖片來源選擇合適的解碼方法。這些解碼方法會為你的位圖分配內存空間并且很容易導致內存不足異常(OutOfMemory exception)。
每個解碼方法具有一些選項屬性,你可以通過BitmapFactory.Option類來指定解碼選項。設置選項中的inJustDecodeBounds屬性,你可以在
解碼的過程中無需為位圖分配內存空間,其返回的是空位圖對象并設置了outWidth,outHeight,outMineType三個選項的值。這個技巧允許你在構造位圖之前,可以先讀取圖片的大小與圖片數據的類型。
BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), R.id.myimage, options); int imageHeight = options.outHeight; int imageWidth = options.outWidth; String imageType = options.outMimeType;這主要是為了避免內存不足異常,所以在解碼圖片之前需要先檢查其大小,除非你完全相信所獲取的圖片的尺寸是固定的并且不會造成內存異?,F象的發生。
加載縮放的圖片進入內存中
現在圖片的尺寸我們已經知道了,這樣我們可以決定是否將整個圖片加載到內存中或者是否縮放后再加載。以下是要考慮的因素:
- 估計加載整個圖片到內存中的內存使用情況
- 考慮你應用程序的其它內存需求,你愿意為你的圖片花費多大的內存
- 考慮展示圖片的控件的尺寸
- 考慮當前設備的屏幕分辨率
例如:不值得將1024*768大小的圖片加載到最終顯示128x96大小縮略圖的ImageView中
因而,我們必須告訴解碼器去下采樣圖片(其實就是縮小圖片),然后將縮小后的圖片加載進入內存中。這需要對BitmapFactory.Options的inSampleSize進行設置,如 2048x1536大小的圖片通過設置inSampleSize大小為4,縮放成 512x384大小,這樣實際消耗內存僅為0.75M(不縮放為12M,這里圖片格式假設為ARGB_8888)??梢愿鶕繕藞D片的大小來計算inSampleSize的大小。
總結
以上是生活随笔為你收集整理的更有效的加载较大的Bitmap的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Android Studio的内存泄
- 下一篇: 在非UI线程中处理Bitmap