最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Android中高效的加載大圖的方法示例

 更新時間:2018年06月05日 14:19:30   作者:ronaldong  
本篇文章主要介紹了在Android中高效的加載大圖的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

將大圖加載到內(nèi)存中總是令人痛苦,因為我們經(jīng)常會在應(yīng)用的崩潰報告中看到OOM(Out Of Memory)的bug。大家都知道,Android系統(tǒng)的內(nèi)存有限。我們必須牢記這一點。

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

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

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

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

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

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

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

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

加載大圖的步驟

  1. 獲取圖片的寬和高
  2. 根據(jù)圖片的寬和高計算縮放比
  3. 使用壓縮比將圖片加載到內(nèi)存中。

BitmapFactory.Options

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

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

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

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

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

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

Reducing Image Size (In Memory)

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

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

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

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

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

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

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

Reducing Image Size (In Disk)

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

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

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

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

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

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

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

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

下面是一張對比效果圖:


以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于Android studio3.6的JNI教程之ncnn之語義分割ENet

    基于Android studio3.6的JNI教程之ncnn之語義分割ENet

    這篇文章主要介紹了基于Android studio3.6的JNI教程之ncnn之語義分割ENet的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2020-03-03
  • 詳解Android中接口回調(diào)、方法回調(diào)

    詳解Android中接口回調(diào)、方法回調(diào)

    在Android開發(fā)中我們很多地方都用到了方法的回調(diào),回調(diào)就是把方法的定義和功能導(dǎo)入實現(xiàn)分開的一種機(jī)制,目的是為了解耦他的本質(zhì)是基于觀察者設(shè)計模式,即觀察者設(shè)計模式的的簡化版。本文主要對Android中接口回調(diào)、方法回調(diào)進(jìn)行詳細(xì)介紹,下面跟著小編一起來看下吧
    2017-01-01
  • Android開發(fā)之自定義View(視圖)用法詳解

    Android開發(fā)之自定義View(視圖)用法詳解

    這篇文章主要介紹了Android開發(fā)之自定義View(視圖)用法,結(jié)合實例形式分析了Android自定義視圖的實現(xiàn)方法與使用注意事項,需要的朋友可以參考下
    2016-10-10
  • Android拍照得到全尺寸圖片并進(jìn)行壓縮

    Android拍照得到全尺寸圖片并進(jìn)行壓縮

    這篇文章主要介紹了Android拍照得到全尺寸圖片并進(jìn)行壓縮 的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • ScrollView與ListView合用(正確計算Listview的高度)的問題解決

    ScrollView與ListView合用(正確計算Listview的高度)的問題解決

    最近做項目中用到ScrollView和ListView一起使用的問題,顯示的時候ListView不能完全正確的顯示,查了好多資料終于成功解決:
    2013-05-05
  • Android App開發(fā)中使用RecyclerView替代ListView的實踐

    Android App開發(fā)中使用RecyclerView替代ListView的實踐

    RecyclerView是Android L即5.0版本以來新加入的一個組件,主要用來實現(xiàn)item的瀑布式排列,因而被人們廣泛認(rèn)為用來替代ListView,這里我們就來看一下Android App開發(fā)中使用RecyclerView替代ListView的實踐:
    2016-06-06
  • 官網(wǎng)項目Jetpack?Startup庫學(xué)習(xí)

    官網(wǎng)項目Jetpack?Startup庫學(xué)習(xí)

    這篇文章主要為大家介紹了官網(wǎng)項目Jetpack?Startup庫學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Android為textView設(shè)置setText的時候報錯的講解方案

    Android為textView設(shè)置setText的時候報錯的講解方案

    今天小編就為大家分享一篇關(guān)于Android為textView設(shè)置setText的時候報錯的講解方案,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Flutter路由框架Fluro使用簡介

    Flutter路由框架Fluro使用簡介

    這篇文章主要介紹了Flutter路由框架Fluro使用簡介,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • PowerManagerService之喚醒鎖的使用獲取創(chuàng)建示例解析

    PowerManagerService之喚醒鎖的使用獲取創(chuàng)建示例解析

    這篇文章主要為大家介紹了PowerManagerService之喚醒鎖的使用獲取創(chuàng)建示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10

最新評論

松潘县| 那坡县| 阜康市| 丰台区| 天气| 佛学| 大兴区| 永吉县| 墨玉县| 登封市| 保山市| 乌拉特前旗| 远安县| 凤山县| 竹山县| 广汉市| 武隆县| 会东县| 微博| 石棉县| 汉沽区| 右玉县| 阳高县| 泽库县| 大新县| 墨玉县| 什邡市| 称多县| 南澳县| 中阳县| 安义县| 尼玛县| 榕江县| 徐州市| 阿克陶县| 岳池县| 翁源县| 秦安县| 尚志市| 双鸭山市| 辽阳县|