Bitmap文件詳解

在我們展開去討論Bitmap之前侵蒙,我們可以看看以下的幾個(gè)問題造虎。

1、什么是Bitmap纷闺,它是怎么存儲(chǔ)的算凿?
2份蝴、什么是PNG,JPG氓轰,JPEG婚夫,GIF,WEBP署鸡,他們本質(zhì)是什么文件案糙?
3、一般地GIF為什么沒有高清大圖靴庆?
4时捌、圖片的壓縮怎么做,分哪些方式炉抒?
5奢讨、圖片在內(nèi)存中所占的大小怎么算?
6端礼、客戶端怎么把圖片做到極致禽笑?

啥是Bitmap?

位圖Bitmap)蛤奥,又稱柵格圖(英語:Raster graphics)或點(diǎn)陣圖佳镜,是使用像素陣列(Pixel-array/Dot-matrix點(diǎn)陣)來表示的圖像。 ---百度百科

Bitmap凡桥,即位圖蟀伸。它本質(zhì)上就是一張圖片的內(nèi)容在內(nèi)存中的表達(dá)形式。那么缅刽,Bitmap是通過什么方式表示一張圖片的內(nèi)容呢啊掏?

Bitmap原理:從純數(shù)學(xué)的角度,任何一個(gè)面都由無數(shù)個(gè)點(diǎn)組成衰猛。但是對(duì)于圖片而言迟蜜,我們沒必要用無數(shù)個(gè)點(diǎn)來表示這個(gè)圖片,畢竟單獨(dú)一個(gè)微小的點(diǎn)人類肉眼是看不清的啡省。換句話說娜睛,由于人類肉眼的能力有限,我們只需要將一張圖片表示為 有限但足夠多的點(diǎn)即可卦睹。點(diǎn)的數(shù)量不能無限畦戒,因?yàn)闊o限的點(diǎn)信息量太大無法存儲(chǔ);但是點(diǎn)的數(shù)量也必須足夠多结序,否則視覺上無法形成連貫性障斋。這里的點(diǎn)就是像素。比如說,某個(gè)658X800的圖片垃环,這里的像素總數(shù)即為1262X600個(gè)邀层。

圖片、屏幕的分辨率與像素之間的關(guān)系介紹

1262X600.png

將圖片內(nèi)容表示為有限但足夠多的像素的集合晴裹,這個(gè)“無限→有限”的思想極其迷人被济。所以,我們只需要將每個(gè)像素的信息存儲(chǔ)起來涧团,就意味著將整個(gè)圖片的內(nèi)容進(jìn)行了表達(dá)只磷。

像素信息:每個(gè)像素的信息,無非就是ARGB四個(gè)通道的值泌绣。其中钮追,A代表透明度,RGB代表紅綠藍(lán)三種顏色通道值阿迈。每個(gè)通道的值范圍在0~255之間元媚,即有256個(gè)值,剛好可以通過一個(gè)字節(jié)(8bit)進(jìn)行表示苗沧。所以刊棕,每個(gè)通道值由一個(gè)字節(jié)表示,四個(gè)字節(jié)表示一個(gè)像素信息待逞,這似乎是最好的像素信息表示方案甥角。

但是這里忽略了兩個(gè)現(xiàn)實(shí)的需求問題:

1、在實(shí)際需求中识樱,我們真的需要這么多數(shù)量的顏色嗎嗤无?上述方案是256X256X256種。有的時(shí)候怜庸,我們并不需要這么豐富的顏色數(shù)量当犯,所以可以適當(dāng)減少表示每個(gè)顏色通道的bit位數(shù)。這么做的好處是節(jié)省空間割疾。也就是說嚎卫,每個(gè)顏色通道都采用8bit來表示是代表全部顏色值的集合;而我們可以采用少于8bit的表示方式宏榕,盡管這會(huì)缺失一部分顏色值驰凛,但是只要顏色夠用即可,并且這還可以節(jié)省內(nèi)存空間担扑。

2、我們真的需要透明度值嗎趣钱?如果我們需要某個(gè)圖片作為背景或者圖標(biāo)涌献,這個(gè)圖片透明度A通道值是必要的。但是如果我們只是普通的圖片展示首有,比如拍攝的照片燕垃,透明度值毫無意義枢劝。細(xì)想一下,你希望你手機(jī)自拍的照片透明或者半透明嗎卜壕?hell no! 因此您旁,透明度這個(gè)通道值是否有必要表示也是根據(jù)需求自由變化的。

具體每個(gè)像素點(diǎn)存儲(chǔ)ARGB值的方案介紹轴捎,后面會(huì)詳細(xì)介紹鹤盒。

總結(jié):Bitmap對(duì)象本質(zhì)是一張圖片的內(nèi)容在內(nèi)存中的表達(dá)形式。它將圖片的內(nèi)容看做是由存儲(chǔ)數(shù)據(jù)的有限個(gè)像素點(diǎn)組成侦副;每個(gè)像素點(diǎn)存儲(chǔ)該像素點(diǎn)位置的ARGB值侦锯。每個(gè)像素點(diǎn)的ARGB值確定下來,這張圖片的內(nèi)容就相應(yīng)地確定下來了秦驯。

詳細(xì)介紹

1尺碰、Bitmap.Config

Config是Bitmap的一個(gè)枚舉內(nèi)部類,它表示的就是每個(gè)像素點(diǎn)對(duì)ARGB通道值的存儲(chǔ)方案译隘。取值有以下四種:

ARGB_8888:這種方案就是上面所說的每個(gè)通道值采8bit來表示亲桥,每個(gè)像素點(diǎn)需要4字節(jié)的內(nèi)存空間來存儲(chǔ)數(shù)據(jù)。該方案圖片質(zhì)量是最高的固耘,但是占用的內(nèi)存也是最大的 也是說他是32位通道或者說它的色深為32-bit题篷。

色深: 指的是每一個(gè)像素點(diǎn)用多少bit來存儲(chǔ)ARGB值,屬于圖片自身的一種屬性玻驻。色深可以用來衡量一張圖片的色彩處理能力(即色彩豐富程度)悼凑。
典型的色深是8-bit、16-bit璧瞬、24-bit和32-bit等户辫。
上述的Bitmap.Config參數(shù)的值指的就是色深。比如ARGB_8888方式的色深為32位嗤锉,RGB_565方式的色深是16位渔欢。

ARGB_4444:這種方案每個(gè)通道都是4位,每個(gè)像素占用2個(gè)字節(jié)瘟忱,圖片的失真比較嚴(yán)重奥额。一般不用這種方案。

RGB_565:這種方案RGB通道值分別占5访诱、6垫挨、5位,但是沒有存儲(chǔ)A通道值触菜,所以不支持透明度九榔。每個(gè)像素點(diǎn)占用2字節(jié),是ARGB_8888方案的一半 也是說他是16位通道或者說它的色深為16-bit。

ALPHA_8:這種方案不支持顏色值哲泊,只存儲(chǔ)透明度A通道值剩蟀,使用場(chǎng)景特殊,比如設(shè)置遮蓋效果等切威。

2育特、位深與色深

我們知道了圖片在內(nèi)存中和在磁盤上的兩種不同的表示形式:前者為Bitmap,后者為各種壓縮格式先朦。這里在介紹一下位深的概念:

位深 指的是在對(duì)Bitmap進(jìn)行壓縮存儲(chǔ)時(shí)存儲(chǔ)每個(gè)像素所用的bit數(shù)缰冤,主要用于存儲(chǔ)。由于是“壓縮”存儲(chǔ)烙无,所以位深一般小于或等于色深 锋谐。
舉個(gè)例子:某張圖片100像素*100像素 色深32位(ARGB_8888),保存時(shí)位深度為24位截酷,那么:

size = width*height*bitCount

該圖片在內(nèi)存中所占大小為:100 * 100 * (32 / 8) Byte
在文件中所占大小為 100 * 100 * ( 24/ 8 ) * 壓縮率 Byte

注意:這里的100*100 值的是像素值涮拗,不是圖片的寬度,要是圖片的寬度是100dp 那還要轉(zhuǎn)換成px 像素值 在Android里假設(shè)當(dāng)前屏幕的密度為240dip根據(jù)換算的公式px = dp * (dpi / 160)
得出100dp的像素值為150px

比較分析:一般我們?cè)贏RGB_8888方式和RGB_565方式中進(jìn)行選扔乜痢:不需要設(shè)置透明度時(shí)三热,比如拍攝的照片等,RGB_565是個(gè)節(jié)省內(nèi)存空間的不錯(cuò)的選擇三幻;既要設(shè)置透明度就漾,對(duì)圖片質(zhì)量要求又高,就用ARGB_8888念搬。

3抑堡、Bitmap的壓縮存儲(chǔ)

Bitmap是圖片內(nèi)容在內(nèi)存中的表示形式,那么如果想要將Bitmap對(duì)象進(jìn)行持久化存儲(chǔ)為一張本地圖片朗徊,需要對(duì)Bitmap對(duì)象表示的內(nèi)容進(jìn)行壓縮存儲(chǔ)首妖。根據(jù)不同的壓縮算法可以得到不同的圖片壓縮格式(簡(jiǎn)稱為圖片格式),比如GIF爷恳、JPEG有缆、BMP、PNG和WebP等温亲。這些圖片的(壓縮)格式可以通過圖片文件的后綴名看出棚壁。

換句話說:Bitmap是圖片在內(nèi)存中的表示,GIF栈虚、JPEG袖外、BMP、PNG和WebP等格式圖片是持久化存儲(chǔ)后的圖片魂务。內(nèi)存中的Bitmap到磁盤上的GIF在刺、JPEG逆害、BMP、PNG和WebP等格式圖片經(jīng)過了”壓縮”過程蚣驼,磁盤上的GIF、JPEG相艇、BMP颖杏、PNG和WebP等格式圖片到內(nèi)存中的Bitmap經(jīng)過了“解壓縮”的過程。

那么坛芽,為什么不直接將Bitmap對(duì)象進(jìn)行持久化存儲(chǔ)而是要對(duì)Bitmap對(duì)象進(jìn)行壓縮存儲(chǔ)呢留储?這么做依據(jù)的思想是:當(dāng)圖片持久化保存在磁盤上時(shí),我們應(yīng)該盡可能以最小的體積來保存同一張圖片的內(nèi)容咙轩,這樣有利于節(jié)省磁盤空間获讳;而當(dāng)圖片加載到內(nèi)存中以顯示的時(shí)候,應(yīng)該將磁盤上壓縮存儲(chǔ)的圖片內(nèi)容完整地展開活喊。前者即為壓縮過程丐膝,目的是節(jié)省磁盤空間;后者即為解壓縮過程钾菊,目的是在內(nèi)存中展示圖片的完整內(nèi)容帅矗。

3.1、有損壓縮和無損壓縮

Bitmap壓縮存儲(chǔ)時(shí)的算法有很多種煞烫,但是整體可分為兩類:有損壓縮和無損壓縮浑此。

1、有損壓縮

有損壓縮的基本依據(jù)是:人的眼睛對(duì)光線的敏感度遠(yuǎn)高于對(duì)顏色的敏感度滞详,光線對(duì)景物的作用比顏色的作用更為重要凛俱。有損壓縮的原理是:保持顏色的逐漸變化,刪除圖像中顏色的突然變化料饥。生物學(xué)中的大量實(shí)驗(yàn)證明蒲犬,人類大腦會(huì)自發(fā)地利用與附近最接近的顏色來填補(bǔ)所丟失的顏色。有損壓縮的具體實(shí)現(xiàn)方法就是刪除圖像中景物邊緣的某些顏色部分稀火。當(dāng)在屏幕上看這幅圖時(shí)暖哨,大腦會(huì)利用在景物上看到的顏色填補(bǔ)所丟失的顏色部分。利用有損壓縮技術(shù)凰狞,某些數(shù)據(jù)被有意地刪除了篇裁,并且在圖片重新加載至內(nèi)存中時(shí)這些數(shù)據(jù)也不會(huì)還原,因此被稱為是“有損”的赡若。有損壓縮技術(shù)可以靈活地設(shè)置壓縮率达布。
無可否認(rèn),利用有損壓縮技術(shù)可以在位圖持久化存儲(chǔ)的過程中大大地壓縮圖片的存儲(chǔ)大小逾冬,但是會(huì)影響圖像質(zhì)量黍聂,這一點(diǎn)在壓縮率很高時(shí)尤其明顯躺苦。所以需要選擇恰當(dāng)?shù)膲嚎s率。

工具推薦:

1.ImageAlpha

ImageAlpha與ImageOptim是同一個(gè)作者产还,不過ImageAlpha屬于有損壓縮匹厘,因此圖片質(zhì)量會(huì)受到影響。所以使用ImageAlpha對(duì)PNG圖片進(jìn)行壓縮后脐区,必須讓設(shè)計(jì)師檢視一下優(yōu)化后的PNG圖片愈诚,以免影響APP的視覺效果。但是ImageAlpha的優(yōu)點(diǎn)是可以極大減少PNG圖片的體積大小牛隅。
ImageAlpha工具的網(wǎng)址為:https://pngmini.com

2.TinyPNG

前面兩個(gè)工具是應(yīng)用程序炕柔,TinyPNG是一個(gè)Web站點(diǎn)。你可以上傳原PNG圖片媒佣,它對(duì)PNG圖片壓縮后你就可以下載優(yōu)化后的結(jié)果了匕累。因?yàn)門inyPNG也是有損壓縮,所以優(yōu)缺點(diǎn)同②
TinyPNG的網(wǎng)址為:https://tinypng.com

2默伍、無損壓縮

無損壓縮的基本原理是:相同的顏色信息只需保存一次欢嘿。具體過程是:首先會(huì)確定圖像中哪些區(qū)域是相同的,哪些是不同的巡验。包括了重復(fù)數(shù)據(jù)的區(qū)域就可以被壓縮际插,只需要記錄該區(qū)域的起始點(diǎn)即可。
從本質(zhì)上看显设,無損壓縮的方法通過刪除一些重復(fù)數(shù)據(jù)框弛,也能在位圖持久化存儲(chǔ)的過程中減少要在磁盤上保存的圖片大小。但是捕捂,如果將該圖片重新讀取到內(nèi)存中瑟枫,重復(fù)數(shù)據(jù)會(huì)被還原。因此指攒,無損壓縮的方法并不能減少圖片的內(nèi)存占用量慷妙,如果要減少圖片占用內(nèi)存的容量,就必須使用有損壓縮方法允悦。
無損壓縮方法的優(yōu)點(diǎn)是能夠比較好地保存圖像的質(zhì)量膝擂,但是相對(duì)來說這種方法的壓縮率比較低。
對(duì)比分析:有損壓縮壓縮率高而且可以靈活設(shè)置壓縮率隙弛,并且刪除的數(shù)據(jù)不可還原架馋,因此可以減少圖片的內(nèi)存占用,但是對(duì)圖片質(zhì)量會(huì)有一定程度的影響全闷;無損壓縮可以很好地保存圖片質(zhì)量叉寂,也能保證一定的壓縮率雖然沒有有損壓縮那么高,并且無損壓縮刪除的數(shù)據(jù)在重新加載至內(nèi)存時(shí)會(huì)被還原总珠,因此不可以減少圖片的內(nèi)存占用屏鳍。

工具推薦:

ImageOptim
ImageOptim是一種無損壓縮工具勘纯,所以你不用擔(dān)心利用該工具對(duì)PNG圖片進(jìn)行壓縮后圖片質(zhì)量會(huì)受影響。它的壓縮原理是:優(yōu)化PNG壓縮參數(shù)钓瞭,移除冗余元數(shù)據(jù)以及非必需的顏色配置文件等驳遵,在不犧牲圖片質(zhì)量的前提下,既減少了PNG圖片的大小降淮,又提高了其加載的速度超埋。

ImageOptim工具的網(wǎng)址為:https://imageoptim.com

3.2常見的壓縮格式

Bitmap的壓縮格式就是最終持久化存儲(chǔ)得到的圖片格式,一般由后綴名即可看出該圖片采用了何種壓縮方式佳鳖。不同的壓縮方式的壓縮算法不一樣。常見的主要有:

1媒惕、Gif

Gif是一種基于LZW算法的無損壓縮格式系吩,其壓縮率一般在50%左右。Gif可插入多幀妒蔚,從而實(shí)現(xiàn)動(dòng)畫效果穿挨。因此Gif圖片分為靜態(tài)GIF和動(dòng)畫GIF兩種GIF格式。

由于Gif以8位顏色壓縮存儲(chǔ)單個(gè)位圖肴盏,所以它最多只能用256種顏色來表現(xiàn)物體科盛,對(duì)于色彩復(fù)雜的物體它就力不從心了。因此Gif不適合用于色彩非常豐富的圖片的壓縮存儲(chǔ)菜皂,比如拍攝的真彩圖片等废麻。

2俗慈、BMP

BMP是標(biāo)準(zhǔn)圖形格式,它是包括Windows在內(nèi)多種操作系統(tǒng)圖像展現(xiàn)的終極形式。其本質(zhì)就是Bitmap對(duì)象直接持久化保存的位圖文件格式蚁堤,由于沒有進(jìn)行壓縮存儲(chǔ),因此體積非常大茫舶,故而不適合在網(wǎng)絡(luò)上傳輸因宇。同時(shí)也是因?yàn)檫@種格式是對(duì)Bitmap對(duì)象的直接存儲(chǔ)而沒有進(jìn)行壓縮,因此我們?cè)谟懻搲嚎s格式時(shí)往往忽略這一種乳怎。

3彩郊、PNG

PNG格式本身的設(shè)計(jì)目的是替代GIF格式,所以它與GIF 有更多相似的地方蚪缀。PNG格式也屬于無損壓縮秫逝,其位深為32位,也就是說它支持所有的顏色類型椿胯。

同樣是無損壓縮筷登,PNG的壓縮率高于Gif格式,而且PNG支持的顏色數(shù)量也遠(yuǎn)高于Gif哩盲,因此:如果是對(duì)靜態(tài)圖片進(jìn)行無損壓縮前方,優(yōu)先使用PNG取代Gif狈醉,因?yàn)镻NG壓縮率高、色彩好惠险;但是PNG不支持動(dòng)畫效果苗傅。所以Gif仍然有用武之地。

PNG缺點(diǎn)是:由于是無損壓縮班巩,因此PNG文件的體積往往比較大渣慕。如果在項(xiàng)目中多處使用PNG圖片文件,那么在APP瘦身時(shí)需要對(duì)PNG文件進(jìn)行優(yōu)化以減少APP體積大小抱慌。具體做法后面會(huì)詳細(xì)介紹逊桦。

4、JPEG

JPEG是一種有損壓縮格式抑进,JPEG圖片以24位顏色壓縮存儲(chǔ)單個(gè)位圖强经。也就是說,JPEG不支持透明通道寺渗。JPEG也不支持多幀動(dòng)畫匿情。

因?yàn)槭怯袚p壓縮,所以需要注意控制壓縮率以免圖片質(zhì)量太差信殊。

JPG和JPEG沒有區(qū)別炬称,全名、正式擴(kuò)展名是JPEG涡拘。但因DOS玲躯、Windows95等早期系統(tǒng)采用的8.3命名規(guī)則只支持最長(zhǎng)3字符的擴(kuò)展名,為了兼容采用了.jpg鲸伴。也因歷史習(xí)慣和兼容性的考慮府蔗,.jpg目前更流行。

JPEG2000作為JPEG的升級(jí)版汞窗,其壓縮率比JPEG高約30%左右姓赤,同時(shí)支持有損和無損壓縮。JPEG2000格式有一個(gè)極其重要的特征在于它能實(shí)現(xiàn)漸進(jìn)傳輸仲吏,即先傳輸圖像的輪廓不铆,然后逐步傳輸數(shù)據(jù),不斷提高圖像質(zhì)量裹唆,讓圖像由朦朧到清晰顯示誓斥。此外,JPEG2000還支持所謂的“感興趣區(qū)域”特性许帐,也就是可以任意指定影像上感興趣區(qū)域的壓縮質(zhì)量劳坑;另外,JPEG2000還可以選擇指定的部分先解壓縮來加載到內(nèi)存中成畦。JPEG2000和JPEG相比優(yōu)勢(shì)明顯距芬,且向下兼容涝开,因此可取代傳統(tǒng)的JPEG格式。

5框仔、WebP

WebP 是 Google 在 2010 年發(fā)布的圖片格式舀武,希望以更高的壓縮率替代 JPEG。它用 VP8 視頻幀內(nèi)編碼作為其算法基礎(chǔ)离斩,取得了不錯(cuò)的壓縮效果银舱。WebP支持有損和無損壓縮、支持完整的透明通道跛梗、也支持多幀動(dòng)畫寻馏,并且沒有版權(quán)問題,是一種非常理想的圖片格式核偿。WebP支持動(dòng)圖操软,基本取代gif。

WebP不僅集成了PNG宪祥、JPEG和Gif的所有功能,而且相同質(zhì)量的無損壓縮WebP圖片體積比PNG小大約26%家乘;如果是有損壓縮蝗羊,相同質(zhì)量的WebP圖片體積比JPEG小25%-34%。

很多人會(huì)認(rèn)為仁锯,既然WebP功能完善耀找、壓縮率更高,那直接用WebP取代上述所有的圖片壓縮格式不就行了嗎业崖?其實(shí)不然野芒,WebP也有其缺點(diǎn):我們知道JPEG是有損壓縮而PNG是無損壓縮,所以JPEG的壓縮率高于PNG双炕;但是有損壓縮的算法決定了其壓縮時(shí)間一定是高于無損壓縮的狞悲,也就是說JPEG的壓縮時(shí)間高于PNG。而WebP無論是無損還是有損壓縮妇斤,壓縮率都分別高于PNG和JPEG摇锋;與其相對(duì)應(yīng)的是其壓縮時(shí)間也比它們長(zhǎng)的多。經(jīng)測(cè)試站超,WebP圖片的編碼時(shí)間比JPEG長(zhǎng)8倍荸恕。可以看出死相,時(shí)間和空間是一對(duì)矛盾融求;如果想要節(jié)省更多的空間,必然要付出額外的時(shí)間算撮;如果想要節(jié)省時(shí)間生宛,那么必然要付出空間的代價(jià)县昂。這取決于我們?cè)趯?shí)際中對(duì)于時(shí)空不同的需求程度來做出選擇。

不管怎么說茅糜,WebP還是一種強(qiáng)大的七芭、理想的圖片壓縮格式,并且借由 Google 在網(wǎng)絡(luò)世界的影響力蔑赘,WebP 在幾年的時(shí)間內(nèi)已經(jīng)得到了廣泛的應(yīng)用狸驳。看看你手機(jī)里的 App:微博缩赛、微信耙箍、QQ、淘寶等等酥馍,每個(gè) App 里都有 WebP 的身影辩昆。

另外,WebP是Android4.0才引入的一種圖片壓縮格式旨袒,如果想要在Android4.0以前的版本支持WebP格式的圖片汁针,那么需要借助于第三方庫來支持WebP格式圖片,例如:webp-android-backport函數(shù)庫砚尽,該開源項(xiàng)目在GitHub地址為:https://github.com/alexey-pelykh/webp-android-backport 當(dāng)然考慮到一般的Android開發(fā)中只需要向下兼容到Android4.0即可施无,所以也可以忽略這個(gè)問題。

目前來說必孤,以上所述的五種壓縮格式猾骡,Android操作系統(tǒng)都提供了原生支持;但是在上層能直接調(diào)用的編碼方式只有 JPEG敷搪、PNG兴想、WebP 這三種。具體的赡勘,可以查看Bitmap類的枚舉內(nèi)部類CompressFormat類的枚舉值來獲取上層能調(diào)用的圖片編碼方式嫂便。你會(huì)發(fā)現(xiàn)枚舉值也是JPEG、PNG和WEBP三種狮含。

如果我們想要在應(yīng)用層使用Gif格式圖片顽悼,需要自行引入第三方函數(shù)庫來提供對(duì)Gif格式圖片的支持。不過一般我們用WebP取代Gif几迄。

因此蔚龙,我們只需要比較分析PNG、JPEG映胁、WebP這三種壓縮格式即可木羹。

3.3、比較分析:

1、對(duì)于攝影類等真彩圖片:因?yàn)槲覀儗?duì)這類色彩豐富的圖片的透明度沒有要求(一般默認(rèn)為不透明)坑填,可以采用JPEG有損壓縮格式抛人,因?yàn)镴PEG本身就不支持透明度,而且因?yàn)槭怯袚p壓縮脐瑰,所以盡管會(huì)犧牲一丟丟照片的質(zhì)量但是可以大大減少體積妖枚。如果非要采用PNG格式,那么首先因?yàn)镻NG支持透明度通道苍在,所以明明不必要的透明度值卻會(huì)被存儲(chǔ)绝页;其次因?yàn)槭菬o損壓縮,所以壓縮率不會(huì)很高從而導(dǎo)致保存的圖片非常大寂恬!綜上比較续誉,建議采用JPEG格式,不要用PNG格式初肉。

JPEG格式可以與Bitmap.Config參數(shù)值為RGB_565搭配使用酷鸦,這是一個(gè)理想的設(shè)置。

2牙咏、對(duì)于logo圖標(biāo)臼隔、背景圖等圖片:這類圖片的特點(diǎn)是往往是有大塊的顏色相同的區(qū)域,這與無損壓縮的思路不謀而合(即刪除重復(fù)數(shù)據(jù))妄壶。而且這類圖片對(duì)透明度是有要求的躬翁,因此可以采用PNG無損壓縮格式;盡管使用PNG格式會(huì)讓圖片有點(diǎn)大盯拱,但是可以在后續(xù)進(jìn)行PNG圖片優(yōu)化以對(duì)APP體積進(jìn)行瘦身。如果非要采用JPEG格式例嘱,那么由于有損壓縮的原理(利用人腦的自動(dòng)補(bǔ)全機(jī)制)狡逢,可能會(huì)隨機(jī)地丟失一些線條導(dǎo)致最終的圖片完全不是想要的效果。綜上比較拼卵,建議使用PNG格式奢浑,不要用JPEG格式。

PNG格式可以與Bitmap.Config參數(shù)值為ARGB_8888搭配使用腋腮,這是一個(gè)理想的設(shè)置雀彼。

當(dāng)然,以上兩種情況即寡,我們都可以使用WebP取代PNG或JPEG徊哑,如果我們想要這么做的話。如果你的項(xiàng)目中對(duì)空間的需求程度更高聪富,你完全有理由這么做莺丑。但是如果你對(duì)空間需求程度還OK,你也可以選擇分情況使用PNG或JPEG格式。

圖片優(yōu)化

圖片優(yōu)化屬于Android性能優(yōu)化的一種梢莽,這里主要是針對(duì)PNG圖片的大小進(jìn)行優(yōu)化萧豆,畢竟PNG這種無損壓縮格式往往會(huì)導(dǎo)致圖片都比較大。除非你的項(xiàng)目已經(jīng)全面支持了WebP格式昏名,否則對(duì)PNG格式圖片的優(yōu)化都會(huì)是你必須考慮的一點(diǎn)涮雷,這有利于減少APP的體積大小。

對(duì)PNG圖片進(jìn)行優(yōu)化的思想是:減少PNG圖片的體積轻局,常用方式有:

1洪鸭、巧用壓縮工具或者壓縮算法

不同的算法壓縮圖片(有的是有損有的是無損),我們需要在圖片質(zhì)量和圖片大小這對(duì)矛盾中根據(jù)實(shí)際情況進(jìn)行選擇嗽交。

2卿嘲、PNG/JPEG轉(zhuǎn)換為WebP

如果不想對(duì)PNG圖片進(jìn)行二次壓縮,可以考慮直接將其替換為WebP格式的圖片夫壁。另外拾枣,我們對(duì)JPEG格式的圖片也可以這么替換。畢竟WebP無論是與PNG還是與JPEG格式想比盒让,壓縮后體積大小都小很多梅肤。WebP轉(zhuǎn)換工具有:

智圖,這是一個(gè)圖片優(yōu)化平臺(tái)邑茄,地址為:https://zhitu.isux.us

iSparta姨蝴,這是一個(gè)針對(duì)PNG圖片的二次壓縮和格式轉(zhuǎn)換工具,地址為:https://isparta.github.io

3肺缕、使用NinePatch格式的PNG圖(Android特有)

.9.png圖片格式簡(jiǎn)稱為NinaPatch圖左医,本質(zhì)上仍然是PNG格式圖片。不過它的優(yōu)點(diǎn)是體積小同木、拉伸不變形浮梢,能夠很好地適配Android各種機(jī)型。我們可以利用Android Studio提供的功能彤路,右鍵一張PNG圖片點(diǎn)擊“create 9=Patch File”即可完成轉(zhuǎn)換秕硝。

4、使用SVG

SVG是一種用XML定義的語言洲尊,用來描述二維矢量及矢量/柵格圖形远豺,它提供了目前網(wǎng)絡(luò)流行的PNG和JPEG格式無法具備的優(yōu)勢(shì):可以任意放大圖形顯示,但絕不會(huì)以犧牲圖像質(zhì)量為代價(jià)坞嘀;可在SVG圖像中保留可編輯和可搜尋的狀態(tài)躯护;平均來講,SVG文件比JPEG和PNG格式的文件要小很多丽涩,因而下載也很快榛做。可以相信,SVG的開發(fā)將會(huì)為Web提供新的圖像標(biāo)準(zhǔn)检眯。

5厘擂、使用切圖服務(wù)

切圖服務(wù)是客戶端,UED锰瘸,運(yùn)營(yíng)人員刽严,圖片服務(wù)后端同事共同協(xié)作去制定一些規(guī)則,保證我們客戶端在圖片加載上做到按尺寸避凝,按比例舞萄,按分辨率等不同緯度去進(jìn)行圖片的處理優(yōu)化 ,切圖服務(wù)能為每部手機(jī)每張圖片得到量身定制的大小尺寸管削,不浪費(fèi)一點(diǎn)空間(理論上)倒脓,在加上端自己平臺(tái)的優(yōu)化,可以將圖片做到很好含思!

總結(jié):無論是二次壓縮還是格式轉(zhuǎn)換崎弃,無論是有損二次壓縮還是無損二次壓縮,我們都需要根據(jù)實(shí)際需求進(jìn)行方案和工具的選擇含潘。

BMP文件 在內(nèi)存中的表示

BMP文件由4部分組成:

  1. 位圖文件頭(bitmap-file header)

  2. 位圖信息頭(bitmap-informationheader)

  3. 顏色表(color table)

  4. 顏色點(diǎn)陣數(shù)據(jù)(bits data)

用UltraEdit打開bmp-1.bmp饲做,可以看到這個(gè)文件的全部數(shù)據(jù)如下圖所示:

bmp-1.png
WX20191204-113644@2x.png

bmp_wx副本.png
1、位圖文件頭(BITMAPFILEHEADER

注意遏弱,BMP的數(shù)據(jù)是倒著念的盆均,這是PC電腦的特色。如果一段數(shù)據(jù)為50 1A 25 3C漱逸,倒著念就是3C 25 1A50泪姨,即0x3C251A50。因此饰抒,如果bfSize的數(shù)據(jù)為50 00 00 00驴娃,實(shí)際上就成了0x00000050,也就是0x50循集。

名稱 占用空間 內(nèi)容 實(shí)際數(shù)據(jù)
bfType 2字節(jié) 標(biāo)識(shí),就是“BM”二字 BM
bfSize 4字節(jié) 整個(gè)BMP文件的大小 0x50(80)【與右鍵查看圖片屬性里面的大小值一樣】
bfReserved1/2 4字節(jié) 保留字蔗草,沒用 0
bfOffBits 4字節(jié) 偏移數(shù)咒彤,即 位圖文件頭+位圖信息頭+調(diào)色板 的大小 0x36(54)
2、位圖信息頭(BITMAPINFOHEADER )

位圖信息頭共40字節(jié):

名稱 占用空間 內(nèi)容 實(shí)際數(shù)據(jù)
biSize 4字節(jié) 位圖信息頭的大小咒精,為40 0x28(40)
biWidth 4字節(jié) 位圖的寬度镶柱,單位是像素 0x02
biHeight/2 4字節(jié) 位圖的高度,單位是像素 0x03
biPlanes 2字節(jié) 固定值1 1
biBitCount 2字節(jié) 每個(gè)像素的位數(shù)1-黑白圖模叙,4-16色歇拆,8-256色,24-真彩色 0x18(24)
biCompression 2字節(jié) 壓縮方式,BI_RGB(0)為不壓縮 0
biSizeImage 4字節(jié) 位圖全部像素占用的字節(jié)數(shù)故觅,BI_RGB時(shí)可設(shè)為0 1A
biXPelsPerMeter 4字節(jié) 水平分辨率(像素/米) -
biYPelsPerMeter 4字節(jié) 垂直分辨率(像素/米) -
biClrUsed 4字節(jié) 位圖使用的顏色數(shù)如果為0厂庇,則顏色數(shù)為2的biBitCount次方 -
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市输吏,隨后出現(xiàn)的幾起案子权旷,更是在濱河造成了極大的恐慌,老刑警劉巖贯溅,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拄氯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡它浅,警方通過查閱死者的電腦和手機(jī)译柏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姐霍,“玉大人鄙麦,你說我怎么就攤上這事∮实” “怎么了黔衡?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)腌乡。 經(jīng)常有香客問我盟劫,道長(zhǎng),這世上最難降的妖魔是什么与纽? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任侣签,我火速辦了婚禮,結(jié)果婚禮上急迂,老公的妹妹穿的比我還像新娘影所。我一直安慰自己,他們只是感情好僚碎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布猴娩。 她就那樣靜靜地躺著,像睡著了一般勺阐。 火紅的嫁衣襯著肌膚如雪卷中。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天渊抽,我揣著相機(jī)與錄音蟆豫,去河邊找鬼。 笑死懒闷,一個(gè)胖子當(dāng)著我的面吹牛十减,可吹牛的內(nèi)容都是我干的栈幸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼帮辟,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼速址!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起织阅,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤壳繁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后荔棉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闹炉,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年润樱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渣触。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壹若,死狀恐怖嗅钻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情店展,我是刑警寧澤养篓,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站赂蕴,受9級(jí)特大地震影響柳弄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜概说,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一碧注、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糖赔,春花似錦萍丐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奋构,卻和暖如春壳影,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背声怔。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舱呻,地道東北人醋火。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓悠汽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親芥驳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柿冲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344