日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

更有效的加载较大的Bitmap

發(fā)布時(shí)間:2025/3/21 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 更有效的加载较大的Bitmap 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

譯文出自谷歌安卓官方: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)視覺(jué)上的好處,而且還會(huì)占用你寶貴的內(nèi)存并引發(fā)額外的內(nèi)存開銷。

本課程將引導(dǎo)你通過(guò)加載更小的下采樣的圖片來(lái)解碼大的圖片,這樣可以防止超出應(yīng)用程序的內(nèi)存限制。


讀取位圖的尺寸與類型

BitmapFactory為創(chuàng)造來(lái)自不同來(lái)源的Bitmap提供了一些解碼方法,如decodeByteArray(),decodeFile(),decodeResource()等。你要通過(guò)你的圖片來(lái)源選擇合適的解碼方法。這些解碼方法會(huì)為你的位圖分配內(nèi)存空間并且很容易導(dǎo)致內(nèi)存不足異常(OutOfMemory exception)。

每個(gè)解碼方法具有一些選項(xiàng)屬性,你可以通過(guò)BitmapFactory.Option類來(lái)指定解碼選項(xiàng)。設(shè)置選項(xiàng)中的inJustDecodeBounds屬性,你可以在

解碼的過(guò)程中無(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大小的圖片通過(guò)設(shè)置inSampleSize大小為4,縮放成 512x384大小,這樣實(shí)際消耗內(nèi)存僅為0.75M(不縮放為12M,這里圖片格式假設(shè)為ARGB_8888)。可以根據(jù)目標(biāo)圖片的大小來(lái)計(jì)算inSampleSize的大小。


public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {// Raw height and width of imagefinal 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; } public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,int reqWidth, int reqHeight) {// 設(shè)置inJustDecodeBounds=true,檢查加載圖片的尺寸final BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeResource(res, resId, options);// 計(jì)算inSampleSize大小options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);// 獲取縮放后的Bitmapoptions.inJustDecodeBounds = false;return BitmapFactory.decodeResource(res, resId, options); } mImageView.setImageBitmap(decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));


《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的更有效的加载较大的Bitmap的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。