中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Android中加載大圖

發布時間:2021-04-07 17:35:42 來源:億速云 閱讀:149 作者:Leah 欄目:移動開發

本篇文章給大家分享的是有關如何在Android中加載大圖,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

使用BitmapFactory來解碼你的圖片。

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage);
imageView.setImageBitmap(bitmap);

看起來一切正常。但是我要告訴你一個問題,讓我們看看這張解碼過的圖片在內存中實際占據的空間大小。

bitmap.getByteCount()方法將返回bitmap的大小。 這張圖片在內存中的大小為12262248字節,相當于12.3 MB。是的,你可能會感到困惑。因為這張圖片在磁盤上的實際大小約為3.5 MB,而getByteCount()方法返回的值遠大于它。原因如下:

存儲在磁盤上的圖片是被壓縮過的(以JPG,PNG或類似的格式存儲)。 一旦將圖片加載到內存中,它就不再被壓縮,并占用盡可能多的圖片的所有像素所需的內存空間。

加載大圖的步驟

  1. 獲取圖片的寬和高

  2. 根據圖片的寬和高計算縮放比

  3. 使用壓縮比將圖片加載到內存中。

BitmapFactory.Options

BitmapFactory可以為我們提供圖片的元數據。我們可以使用這個類來實現第一步。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage, options);

我們將BitmapFactory.Options實例傳遞給BitmapFactory.decodeSource()方法。 options.inJustDecodeBounds = true 是什么意思?這句代碼是指我們不想將圖片加載到內存中。我們只想獲取圖片的相關信息(寬度,高度等),并使用這些信息來計算縮放比例。

我們運行這段代碼和并打印圖片的信息:

options.outHeight : 1126
options.outWidth : 2000
options.bitmap : null

它只輸出了圖片的高度和寬度。

Reducing Image Size (In Memory)

現在我們需要計算 inSampleSize 。什么是inSampleSize? inSampleSize是BitmapFactory.Options類的一個屬性,用于設置圖片的縮放比。

如果我們有一張尺寸為1000x1000的圖片,并且在解碼之前設置inSampleSize的值為2, 那么解碼之后,我們將得到一張尺寸為500x500的圖片。 如果我們有一張尺寸為200x400的圖片,并且在解碼之前設置inSampleSize的值為5, 那么解碼之后,我們將得到一張尺寸為40x80的圖片。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inSampleSize = 3; 
BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage, options);

我們可以直接這樣做嗎?不能,因為我們不知道圖片大小是多少。如果它是小圖片,并且我們使其更小,那么我們的用戶可以看到的就是一些像素而不是圖像。有一些圖片需要縮放5倍,另一些圖片則需要縮放2倍。我們不能將縮放比設置為一個常數,所以我們必須根據圖片的大小來計算它的值。

如何計算inSampleSize的值取決于您。我的意思是,你可以根據你的需要編寫inSampleSize的計算方法。在android官方文檔中,計算結果是2的冪次方。

options.inSampleSize = calculateInSampleSize(options, 500,500);
options.inJustDecodeBounds = false;
Bitmap smallBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage, options);

這里我們將 inJustDecodeBounds 的值設為false,并獲得了一個bitmap對象。現在,bitmap.getByteCount()方法返回的圖片大小是3.1 MB。這是它在內存中的大小。正如我之前說過的,圖片存儲在磁盤上時會被壓縮。當我們將它們加載到內存中時它們會占據更大的內存空間。通過上面這種方法,我們將它在內存中占據的空間大小從12.3 MB減少到了3.1 MB,減少了75%。

Reducing Image Size (In Disk)

我們還可以使用Bitmap的 compress 方法對磁盤上的圖片進行壓縮。

我們來看看在不改變圖片質量的情況下圖片被壓縮后的大小。 100 表示與原圖保持相同的質量。

ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
byte[] bitmapdata = bos.toByteArray();

通過計算得到圖片在磁盤上的大小為1.6 MB。

我們把compress方法中的質量參數改為50,并再次計算圖片大小。

bitmap.compress(Bitmap.CompressFormat.JPEG, 50, bos);

通過計算得到圖片在磁盤上的大小為24.4 KB。

注意:在改變compress方法中的質量參數的時候,壓縮格式應該是.JPEG。設置為PNG格式的時候,修改是無效的。

以上就是如何在Android中加載大圖,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巩义市| 金华市| 玉树县| 福安市| 明溪县| 商南县| 嘉鱼县| 安平县| 永城市| 于田县| 土默特左旗| 颍上县| 宜宾市| 九龙城区| 信丰县| 墨脱县| 额敏县| 丹东市| 罗山县| 武义县| 浦东新区| 天长市| 松江区| 兴隆县| 巴林右旗| 巴彦淖尔市| 黄浦区| 锡林郭勒盟| 怀远县| 克什克腾旗| 壶关县| 威远县| 阜阳市| 万宁市| 康平县| 上饶县| 盐池县| 句容市| 四川省| 怀柔区| 翁源县|