日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

更有效的加载较大的Bitmap

發布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 更有效的加载较大的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)。可以根據目標圖片的大小來計算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) {// 設置inJustDecodeBounds=true,檢查加載圖片的尺寸final BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeResource(res, resId, options);// 計算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));


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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。