欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學(xué)堂Android培訓(xùn)在Android中高效的加載大圖的方法示例

2018-06-26 15:17:25 1393瀏覽

   將大圖加載到內(nèi)存中總是令人痛苦,因?yàn)槲覀兘?jīng)常會(huì)在應(yīng)用的崩潰報(bào)告中看到OOM(OutOfMemory)的bug。大家都知道,Android系統(tǒng)的內(nèi)存有限。我們必須牢記這一點(diǎn)。所以,當(dāng)我們進(jìn)行Android培訓(xùn)時(shí),講師一般都會(huì)將一些細(xì)節(jié)的地講解,去放大,去加深,為了以后不要在一些細(xì)節(jié)的地方,去胡亂找錯(cuò),結(jié)下來就是Android高效加載大圖的事例。

stackoverflow上有很多關(guān)于大圖加載的問題,當(dāng)你的應(yīng)用程序遇到OOM的時(shí)候,你可以選擇直接復(fù)制粘貼其中的答案來解決這個(gè)問題。因此,你完全可以略過本篇文章,但我想介紹一些加載大圖的基礎(chǔ)知識(shí)及其實(shí)際工作的原理。




我只想解釋圖片解碼背后的邏輯。我建議你使用Picasso或Glide來加載圖片。沒有必要重新發(fā)明輪子。

將圖片加載到內(nèi)存中

這很簡單。你只需要使用BitmapFactory來解碼你的圖片。

Bitmapbitmap=BitmapFactory.decodeResource(getResources(),R.mipmap.hqimage);

imageView.setImageBitmap(bitmap);

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

bitmap.getByteCount()方法將返回bitmap的大小。這張圖片在內(nèi)存中的大小為12262248字節(jié),相當(dāng)于12.3MB。是的,你可能會(huì)感到困惑。因?yàn)檫@張圖片在磁盤上的實(shí)際大小約為3.5MB,而getByteCount()方法返回的值遠(yuǎn)大于它。原因如下:

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

加載大圖的步驟

獲取圖片的寬和高

根據(jù)圖片的寬和高計(jì)算縮放比

使用壓縮比將圖片加載到內(nèi)存中。

BitmapFactory.Options

BitmapFactory可以為我們提供圖片的元數(shù)據(jù)。我們可以使用這個(gè)類來實(shí)現(xiàn)第一步。

BitmapFactory.Optionsoptions=newBitmapFactory.Options();

options.inJustDecodeBounds=true;

BitmapFactory.decodeResource(getResources(),R.mipmap.hqimage,options);


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

我們運(yùn)行這段代碼和并打印圖片的信息:

options.outHeight:1126

options.outWidth:2000

options.bitmap:null


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

ReducingImageSize(InMemory)

現(xiàn)在我們需要計(jì)算inSampleSize。什么是inSampleSize?inSampleSize是BitmapFactory.Options類的一個(gè)屬性,用于設(shè)置圖片的縮放比。

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

BitmapFactory.Optionsoptions=newBitmapFactory.Options();

options.inJustDecodeBounds=true;

options.inSampleSize=3;

BitmapFactory.decodeResource(getResources(),R.mipmap.hqimage,options);


我們可以直接這樣做嗎?不能,因?yàn)槲覀儾恢缊D片大小是多少。如果它是小圖片,并且我們使其更小,那么我們的用戶可以看到的就是一些像素而不是圖像。有一些圖片需要縮放5倍,另一些圖片則需要縮放2倍。我們不能將縮放比設(shè)置為一個(gè)常數(shù),所以我們必須根據(jù)圖片的大小來計(jì)算它的值。

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

options.inSampleSize=calculateInSampleSize(options,500,500);

options.inJustDecodeBounds=false;

BitmapsmallBitmap=BitmapFactory.decodeResource(getResources(),R.mipmap.hqimage,options);

這里我們將inJustDecodeBounds的值設(shè)為false,并獲得了一個(gè)bitmap對象?,F(xiàn)在,bitmap.getByteCount()方法返回的圖片大小是3.1MB。這是它在內(nèi)存中的大小。正如我之前說過的,圖片存儲(chǔ)在磁盤上時(shí)會(huì)被壓縮。當(dāng)我們將它們加載到內(nèi)存中時(shí)它們會(huì)占據(jù)更大的內(nèi)存空間。通過上面這種方法,我們將它在內(nèi)存中占據(jù)的空間大小從12.3MB減少到了3.1MB,減少了75%。

ReducingImageSize(InDisk)

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

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

ByteArrayOutputStreambos=newByteArrayOutputStream();

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

byte[]bitmapdata=bos.toByteArray();


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

我們把compress方法中的質(zhì)量參數(shù)改為50,并再次計(jì)算圖片大小。

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


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

注意:在改變compress方法中的質(zhì)量參數(shù)的時(shí)候,壓縮格式應(yīng)該是.JPEG。設(shè)置為PNG格式的時(shí)候,修改是無效的。

下面是一張對比效果圖:

 


以上就是在Android中高效的加載大圖的方法示例,假如你對Android 感興趣,假如你x想了解更多的有關(guān)Android知識(shí),請登錄扣丁學(xué)堂官網(wǎng),或者關(guān)注微信公眾號,了解更多,更有大量Android在線視頻教程。心動(dòng)不如行動(dòng)!


扣丁學(xué)堂微信公眾號



【關(guān)注微信公眾號獲取更多學(xué)習(xí)資料】



查看更多關(guān)于“Android開發(fā)技術(shù)的相關(guān)資訊>>

標(biāo)簽: Android Android培訓(xùn) Android入門 Android視頻教程

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費(fèi)咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號-2   Copyright ? 2017 - 2022
返回頂部 返回頂部