在我們展開去討論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è)邀层。
將圖片內(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部分組成:
位圖文件頭(bitmap-file header)
位圖信息頭(bitmap-informationheader)
顏色表(color table)
顏色點(diǎn)陣數(shù)據(jù)(bits data)
用UltraEdit打開bmp-1.bmp饲做,可以看到這個(gè)文件的全部數(shù)據(jù)如下圖所示:
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次方 | - |