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