Android bitmap config你理解對(duì)了嗎?

在寫本文之前剩愧,我還以為自己對(duì)android的bitmap很熟悉猪叙,直到自己親手寫代碼實(shí)踐,才發(fā)現(xiàn)自己錯(cuò)了很多年。真是汗顏把妗犬第!

Bitmap Config

首先,根據(jù)Android API 25的文檔簡(jiǎn)要說(shuō)明一下Android的Bitmap.Config以下4個(gè)選項(xiàng)

  • ALPHA_8: 每個(gè)像素占用1字節(jié)(8位)芒帕,存儲(chǔ)的是透明度信息歉嗓。
  • ARGB_4444: 每個(gè)像素占用2字節(jié)(4+4+4+4=16位),ARGB分別占用4位背蟆,支持alpha通道鉴分。
    注:從API 13開始不推薦使用,在android 4.4上面带膀,設(shè)置的ARGB_4444會(huì)被系統(tǒng)使用ARGB_8888替換
  • ARGB_8888: 默認(rèn)的選項(xiàng)志珍,每像素占用4字節(jié),ARGB分別占8位垛叨,支持1600萬(wàn)種顏色伦糯,質(zhì)量最高,當(dāng)然內(nèi)存占用也高嗽元。
  • RGB_565: 每像素占用2字節(jié)敛纲,RGB分別占5,6剂癌,5位淤翔。支持65535種顏色,不支持alpha珍手。
bitmap.config ALPHA_8 ARGB_4444 ARGB_8888 RGB_565
bytes/pixel 1 byte 2 byte 4 byte 2 byte
alpha channel 8 bit 4 bit 8 bit not support

PNG 格式

其次办铡,簡(jiǎn)要說(shuō)一下png格式

  • png 8: 支持不透明,索引色透明琳要,alpha透明寡具,最大支持256種顏色
  • png 24: 不支持透明,支持1600萬(wàn)種顏色
  • png 32: 支持透明稚补,其它同png 24童叠,支持1600萬(wàn)種顏色

bitmap內(nèi)存占用計(jì)算

第三,簡(jiǎn)要說(shuō)一下bitmap占用的內(nèi)存

Android中bitmap的內(nèi)存占用是跟圖片的尺寸(高和寬)相關(guān)课幕。一張圖片的內(nèi)存占用大致的計(jì)算公式如下:

占用內(nèi)存 = 圖像像素總和(width x height)再 x 每像素(bitmap config)占用的字節(jié)數(shù)

以下是通過(guò)代碼準(zhǔn)確計(jì)算

    public static int getSizeInBytes(@Nullable Bitmap bitmap) {
        if (bitmap == null) {
            return 0;
        }

        // There's a known issue in KitKat where getAllocationByteCount() can throw an NPE. This was
        // apparently fixed in MR1: http://bit.ly/1IvdRpd. So we do a version check here, and
        // catch any potential NPEs just to be safe.
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
            try {
                return bitmap.getAllocationByteCount();
            } catch (NullPointerException npe) {
                // Swallow exception and try fallbacks.
            }
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) {
            return bitmap.getByteCount();
        }

        // Estimate for earlier platforms.
        return bitmap.getWidth() * bitmap.getRowBytes();
    }

以一張10241024的圖片為例厦坛,使用ARGB_8888,占用的內(nèi)存為10241024*4=4M乍惊。像現(xiàn)在的手機(jī)攝像頭動(dòng)不動(dòng)就是上千萬(wàn)像素杜秸,拍出來(lái)的照片如果按默認(rèn)的ARGB_8888 config加載,則至少是幾十M的內(nèi)存占用润绎。

Android的圖片資源主要分兩部分:

  1. 一種是apk中自帶的撬碟,多為png格式诞挨,由系統(tǒng)加載,支持縮放呢蛤,代碼中通過(guò)R.xxx引用惶傻,decode時(shí)使用的是默認(rèn)的ARGB_8888選項(xiàng),圖像質(zhì)量高其障;
  2. 另一種是網(wǎng)絡(luò)圖片或本地圖片银室,多為jpg格式,加載時(shí)一般使用第三方的圖片加載庫(kù)励翼,為節(jié)省內(nèi)存decode時(shí)多為RGB_565選項(xiàng)蜈敢。

平時(shí)都是這么用,也沒發(fā)現(xiàn)問(wèn)題抚笔,優(yōu)化內(nèi)存占用時(shí)扶认,一般也是從圖片的尺寸方面入手。不過(guò)最近優(yōu)化一個(gè)跟圖片相關(guān)的功能殊橙,在圖片尺寸無(wú)法縮放的條件下辐宾,只能通過(guò)更改bitmap config來(lái)降低內(nèi)存的占用。然后意外的發(fā)現(xiàn)膨蛮,導(dǎo)致顛覆了我的三觀叠纹。為此我特地寫了一個(gè)測(cè)試sample,代碼詳見github敞葛,特地創(chuàng)建了一張背景色透明誉察,圖片內(nèi)容為A(黑色50%透明度)R(紅色)G(綠色)B(藍(lán)色)圖片,然后分別導(dǎo)出為:png8(alpha透明)惹谐、png24(不透明)持偏、png32和jpeg(不透明)格式的圖,分別使用ALPHA_8, ARGB_4444, ARGB_8888, RGB_565四種config加載圖片氨肌,得到的實(shí)際結(jié)果如下(假設(shè)圖像總像素為X)鸿秆。

實(shí)踐結(jié)果

運(yùn)行截圖

screenshot
screenshot

結(jié)果統(tǒng)計(jì)

bitmap.config ALPHA_8 ARGB_4444 ARGB_8888 RGB_565
png8
41 X 2 X 4 X 42 X A 透明
png24
41 X 2 X 4 X 2 X
png32
41 X 2 X 4 X 42 X A 透明
jpeg
41 X 2 X 4 X 2 X

請(qǐng)注意表格中帶刪除線的部分

  1. ALPHA_8:config占用的內(nèi)存竟然和ARGB_8888一樣,不是說(shuō)每個(gè)像素占用1字節(jié)的么怎囚?
  2. RGB_565:在png8和png32中卿叽,圖片中的A都保持了50%的透明度,而且占用的內(nèi)存也和ARGB_8888一樣恳守,不是說(shuō)RGB_565不包含alpha么考婴?不是說(shuō)占用的內(nèi)存是ARGB_8888的一半么?
  3. ARGB_4444:在android 6.0上面催烘,png8和png32看不見(全透明)沥阱,png24和jpeg顯示為一塊黑色區(qū)域,在android 4.2上則顯示正常伊群。

帶著上面的疑問(wèn)考杉,在網(wǎng)上進(jìn)行了相關(guān)的搜索屁使,也沒有找到答案。好吧奔则,我是懵了,不知道各位看客如何蔽午?附上github上的示例工程:https://github.com/Jamling/BitmapConfig

本文永久鏈接: http://www.ieclipse.cn/2017/06/14/Android/Android-bitmap-config/ 未經(jīng)允許易茬,禁止轉(zhuǎn)載,如有問(wèn)題及老,請(qǐng)?jiān)谖业牟┛驮柬?yè)面提交評(píng)論抽莱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市骄恶,隨后出現(xiàn)的幾起案子食铐,更是在濱河造成了極大的恐慌,老刑警劉巖僧鲁,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虐呻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡寞秃,警方通過(guò)查閱死者的電腦和手機(jī)斟叼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)春寿,“玉大人朗涩,你說(shuō)我怎么就攤上這事“蟾模” “怎么了谢床?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)厘线。 經(jīng)常有香客問(wèn)我识腿,道長(zhǎng),這世上最難降的妖魔是什么皆的? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任覆履,我火速辦了婚禮,結(jié)果婚禮上费薄,老公的妹妹穿的比我還像新娘硝全。我一直安慰自己,他們只是感情好楞抡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布伟众。 她就那樣靜靜地躺著,像睡著了一般召廷。 火紅的嫁衣襯著肌膚如雪凳厢。 梳的紋絲不亂的頭發(fā)上账胧,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音先紫,去河邊找鬼治泥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛遮精,可吹牛的內(nèi)容都是我干的居夹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼本冲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼准脂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起檬洞,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤狸膏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后添怔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體湾戳,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年澎灸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了院塞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡性昭,死狀恐怖拦止,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情糜颠,我是刑警寧澤汹族,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站其兴,受9級(jí)特大地震影響顶瞒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜元旬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一榴徐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匀归,春花似錦坑资、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至体啰,卻和暖如春攒巍,著一層夾襖步出監(jiān)牢的瞬間嗽仪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工柒莉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闻坚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓兢孝,卻偏偏與公主長(zhǎng)得像鲤氢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子西潘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 2021期待與你一起共事,點(diǎn)擊查看崗位[http://www.reibang.com/p/6f4d67fa406...
    閑庭閱讀 16,636評(píng)論 0 75
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,133評(píng)論 25 707
  • 一直以來(lái)Bitmap都是開發(fā)中很棘手的問(wèn)題哨颂,這個(gè)問(wèn)題就是傳說(shuō)中的OOM(java.lang.OutofMemory...
    M悇芐冋憶閱讀 4,784評(píng)論 0 11
  • 寫一句話要有一句話的作用喷市,不矯情,不做無(wú)病呻吟威恼;干脆利落品姓,不拖泥帶水。 寫作水平不高箫措,自己不熟的詞匯腹备,一定弄清含義...
    帥氣的小恒閱讀 215評(píng)論 2 3
  • 那天,去探望剛生下寶寶的玨斤蔓。到了醫(yī)院植酥,上了樓,進(jìn)入產(chǎn)科弦牡。 這絕對(duì)是每個(gè)醫(yī)院最有人情味的地方友驮,也是醫(yī)院里能讓人快樂(lè)、...
    粉妖閱讀 376評(píng)論 0 1