Android Bitmap的常用壓縮方式

一、前言

已經(jīng)好久沒有更新博客稠氮,大概有半年了,主要是博主這段時(shí)間忙于找工作半开,Android崗位的工作真的是越來越難找隔披,好不容易在廣州找到一家,主要做海外產(chǎn)品寂拆,公司研發(fā)實(shí)力也不錯(cuò)奢米,所以就敲定了三方協(xié)議。現(xiàn)在已經(jīng)在公司實(shí)習(xí)了一個(gè)月多纠永,目前主要是負(fù)責(zé)公司某個(gè)產(chǎn)品的內(nèi)存優(yōu)化鬓长,剛好就總結(jié)了一下Android Bitmap常用的優(yōu)化方式。

Android中的圖片是以Bitmap方式存在的尝江,繪制的時(shí)候也是Bitmap涉波,直接影響到app運(yùn)行時(shí)的內(nèi)存,在Android,Bitmap所占用的內(nèi)存計(jì)算公式是:圖片長(zhǎng)度 x 圖片寬度 x像素點(diǎn)的字節(jié)數(shù)

二啤覆、圖片常用的壓縮格式

Enum Values
ALPHA_8 每個(gè)像素都存儲(chǔ)為一個(gè)半透明(alpha)通道
ARGB_4444 此字段已在API級(jí)別13中棄用善延。由于此配置的質(zhì)量較差,建議使用ARGB_8888
ARGB_8888 每個(gè)像素存儲(chǔ)在4個(gè)字節(jié)城侧。
RGB_565 每個(gè)像素存儲(chǔ)在2個(gè)字節(jié)中易遣,只有RGB通道被編碼:紅色以5位精度存儲(chǔ)(32個(gè)可能值),綠色以6位精度存儲(chǔ)(64個(gè)可能值)嫌佑,藍(lán)色存儲(chǔ)為5位精確豆茫。

其中字母代表的意思我們大概都可以理解,接下來我們來算算它們單個(gè)像素點(diǎn)的字節(jié)數(shù):

  • ALPHA_8:表示8位Alpha位圖,即透明度占8個(gè)位,一個(gè)像素點(diǎn)占用1個(gè)字節(jié),它沒有顏色,只有透明度屋摇。
  • ARGB_4444:表示16位ARGB位圖揩魂,即A=4,R=4,G=4,B=4,一個(gè)像素點(diǎn)占4+4+4+4=16位,2個(gè)字節(jié)炮温。
  • ARGB_8888:表示32位ARGB位圖火脉,即A=8,R=8,G=8,B=8,一個(gè)像素點(diǎn)占8+8+8+8=32位,4個(gè)字節(jié)柒啤。
  • RGB_565 :表示16位RGB位圖,即R=5,G=6,B=5,它沒有透明度,一個(gè)像素點(diǎn)占5+6+5=16位倦挂,2個(gè)字節(jié)

我們?cè)谧鰤嚎s處理的時(shí)候,可以先通過改變Bitmap的圖片格式担巩,來達(dá)到壓縮的效果方援,其實(shí)壓縮最主要就是要么改變其寬高,要么就通過減少其單個(gè)像素占用的內(nèi)存涛癌。

三犯戏、常用的壓縮方法:

1.質(zhì)量壓縮

    private void compressQuality() {
        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
        mSrcSize = bm.getByteCount() + "byte";
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
        byte[] bytes = bos.toByteArray();
        mSrcBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    }

質(zhì)量壓縮不會(huì)減少圖片的像素,它是在保持像素的前提下改變圖片的位深及透明度拳话,來達(dá)到壓縮圖片的目的先匪,圖片的長(zhǎng),寬弃衍,像素都不會(huì)改變呀非,那么bitmap所占內(nèi)存大小是不會(huì)變的。

我們可以看到有個(gè)參數(shù):quality笨鸡,可以調(diào)節(jié)你壓縮的比例姜钳,但是還要注意一點(diǎn)就是坦冠,質(zhì)量壓縮堆png格式這種圖片沒有作用形耗,因?yàn)閜ng是無損壓縮。

2.采樣率壓縮

    private void compressSampling() {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 2;
        mSrcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, options);
    }

采樣率壓縮其原理其實(shí)也是縮放bitamp的尺寸辙浑,通過調(diào)節(jié)其inSampleSize參數(shù)激涤,比如調(diào)節(jié)為2,寬高會(huì)為原來的1/2,內(nèi)存變回原來的1/4.

3.放縮法壓縮

    private void compressMatrix() {
        Matrix matrix = new Matrix();
        matrix.setScale(0.5f, 0.5f);
        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
        mSrcBitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
        bm = null;
    }

放縮法壓縮使用的是通過矩陣對(duì)圖片進(jìn)行裁剪倦踢,也是通過縮放圖片尺寸送滞,來達(dá)到壓縮圖片的效果,和采樣率的原理一樣辱挥。

4.RGB_565壓縮

    private void compressRGB565() {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        mSrcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, options);
    }

這是通過壓縮像素占用的內(nèi)存來達(dá)到壓縮的效果犁嗅,一般不建議使用ARGB_4444,因?yàn)楫嬞|(zhì)實(shí)在是辣雞晤碘,如果對(duì)透明度沒有要求褂微,建議可以改成RGB_565,相比ARGB_8888將節(jié)省一半的內(nèi)存開銷园爷。

5.createScaledBitmap

    private void compressScaleBitmap() {
        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
        mSrcBitmap = Bitmap.createScaledBitmap(bm, 600, 900, true);
        bm = null;
    }

將圖片的大小壓縮成用戶的期望大小宠蚂,來減少占用內(nèi)存。

四童社、效果圖

show.gif

五求厕、總結(jié)

以上5種就是我們常用的壓縮方法了,這里的壓縮也只是針對(duì)在運(yùn)行加載的bitmap占用內(nèi)存的大小扰楼。我們?cè)谧鯝pp內(nèi)存優(yōu)化的時(shí)候呀癣,一般可以從這兩個(gè)方面入手,一個(gè)內(nèi)存泄漏弦赖,另外一個(gè)是Bitmap壓縮了十艾,在要求像素不高的情況下,可以對(duì)Bitmap進(jìn)行壓縮腾节,并且針對(duì)一些只使用一次的bitmap忘嫉,要做好recycle的處理。

博客就寫到這里案腺,以下是源碼地址庆冕。
·

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市劈榨,隨后出現(xiàn)的幾起案子访递,更是在濱河造成了極大的恐慌,老刑警劉巖同辣,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拷姿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡旱函,警方通過查閱死者的電腦和手機(jī)响巢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棒妨,“玉大人踪古,你說我怎么就攤上這事。” “怎么了伏穆?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵拘泞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我枕扫,道長(zhǎng)陪腌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任烟瞧,我火速辦了婚禮偷厦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘燕刻。我一直安慰自己只泼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布卵洗。 她就那樣靜靜地躺著请唱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪过蹂。 梳的紋絲不亂的頭發(fā)上十绑,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音酷勺,去河邊找鬼本橙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛脆诉,可吹牛的內(nèi)容都是我干的甚亭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼击胜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼亏狰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起偶摔,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤暇唾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后辰斋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體策州,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年宫仗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了够挂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锰什,死狀恐怖下硕,靈堂內(nèi)的尸體忽然破棺而出丁逝,到底是詐尸還是另有隱情汁胆,我是刑警寧澤梭姓,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站嫩码,受9級(jí)特大地震影響誉尖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铸题,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一铡恕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丢间,春花似錦探熔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至饮六,卻和暖如春其垄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卤橄。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工绿满, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窟扑。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓喇颁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嚎货。 傳聞我的和親對(duì)象是個(gè)殘疾皇子无牵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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