前段時間發(fā)布的小米10系列手機采用了一種新的圖片格式:HEIF,能夠在保持畫質(zhì)不變的前提下縮減至少50%的文件體積。
▲圖自:HEIF官網(wǎng)
HEIF格式照片的文件擴展名一般是.HEIC(也有其他的格式)??吹竭@個格式名,用iPhone的小伙伴一定很熟悉。
沒錯,蘋果在2017年iOS 11系統(tǒng)上就已經(jīng)開始支持這種圖片格式,大家可以去翻翻IT之家的老文章(點此前往)。
據(jù)汐元所知,蘋果應(yīng)該是最早在手機上廣泛應(yīng)用HEIF圖片格式的了,不過當時很多小伙伴對這個圖片格式不太了解,加上當年兼容性不好,給大家導(dǎo)圖片帶來諸多不便,所以,很多小伙伴對蘋果當時的決定表示不屑,甚至不滿。
感受一下當年很多網(wǎng)友的評論:
包括汐元也是,因為做評測經(jīng)常需要把圖片導(dǎo)到自己的Windows電腦上,結(jié)果在電腦上打不開這個格式,還要轉(zhuǎn)格式,任務(wù)著急的時候真心想給蘋果寄刀片。
不過,時間證明,蘋果的決定是對的,我錯了。
后來,Windows 10系統(tǒng)和安卓9系統(tǒng)在2018年也開始支持HEIF圖片格式。同年,三星Note9其實也已經(jīng)支持.HEIC照片。
小米10發(fā)布前,雷軍甚至表示,等HEIF普及后,估計JPEG和GIF就可以淘汰了。
汐元覺得,未來如果HEIF普及了,也許真的可以取代JPEG和GIF。
寫這句話的時候,汐元覺得臉上火辣辣得疼。
說到這里,相信大家都很好奇,HEIF究竟是怎么夠做到保證畫質(zhì)不變而縮小文件體積的?
汐元翻了一下網(wǎng)上的資料,大多沒有明確針對這個問題進行說明。所以這篇文章打算聚焦這個問題來為大家介紹。
為什么HEIF相比JPEG能夠在畫質(zhì)不變的情況下將文件體積大幅縮???
我們首先要明白JPEG的圖片格式具體是怎么樣的。
所謂JPEG格式的圖片,其實說的是一種圖像壓縮的技術(shù)標準,使用這種標準壓縮出來的圖片,就叫“JPEG文件”。
JPEG文件后綴名包括JPG、JPEG、JPE、JFIF以及JIF。都是我們熟悉的。
那么JPEG標準是怎么壓縮圖片的呢?
我們知道,一張圖片放大后,就可以看到一個一個的像素點。
每個像素點,都包含了描述這個像素點顏色的一組數(shù)值,這個叫色彩空間,例如我們熟悉的RGB色彩空間,還有CMYK色彩空間等。
一般照片用的是RGB色彩空間,而JPEG標準采用的是一種叫做YCbCr的色彩空間。所以壓縮之前,要先進行色彩空間轉(zhuǎn)換。
▲圖自:wikimedia
YCbCr色彩空間中,Y表示的是亮度,Cb代表藍色的彩度,Cr表示的是紅色的彩度。
換句話說,Y代表亮度,CbCr代表色彩。
轉(zhuǎn)換之后,每個像素背后變成了另一組數(shù)值。
因為人眼對亮度敏感,對色彩不那么敏感,所以實際壓縮的時候,JPEG標準不會對亮度信息做太多改變,主要對色彩信息做壓縮。
壓縮有兩種,一種是有損壓縮,一種是無損壓縮。JPEG在壓縮時,兩種都會用,一般先進行有損壓縮,然后進行無損壓縮。
有損壓縮第一步是對Cb通道和Cr通道的色彩數(shù)據(jù)按照一定的比例進行取樣。這個過程就損失了一部分數(shù)據(jù)。
第二步,就是將一張圖片中的像素分成無數(shù)個8×8像素的方塊,每個方塊里有64個像素,對應(yīng)64組數(shù)據(jù)。
然后,將這64組數(shù)據(jù)進行一種叫離散余弦變換(DCT)的數(shù)學(xué)處理,處理后,這64組數(shù)據(jù)就變成了數(shù)據(jù)更簡潔一些的系數(shù)矩陣。
至于這個離散余弦變換怎么搞,就不用了解了,懂高數(shù)的IT之家小伙伴可以自行去學(xué)習(xí)。
總之,在經(jīng)過DCT變換后,64組像素數(shù)值變成了64個系數(shù),這個過程又產(chǎn)生了數(shù)據(jù)損失。
接下來,對于這一組8×8的序數(shù)矩陣,還不能直接處理,要繼續(xù)進行一步叫“量化”的處理過程。
量化是怎么進行的大家不用知道,只需要知道,量化的目的是適當減小矩陣內(nèi)各個像素點之間的差別。因為人眼對小范圍內(nèi)差別高的像素區(qū)域辨別能力不高,所以不如削減它們的差異。
經(jīng)過量化處理后,8×8的序數(shù)矩陣變成了一組更加簡潔的數(shù)字矩陣,有大面積的0。
很顯然,這一步,又損失了一部分數(shù)據(jù)。
好,走到這一步,接下來就是無損壓縮了。
首先,我們把上一步量化后的8×8數(shù)字矩陣提取出來。提取的順序是這樣“Z”字型的。
提取出來后,得到64個數(shù)據(jù)。這64個數(shù)據(jù)中,第一個數(shù)字叫DC系數(shù)編碼,后面63個數(shù)字叫AC系數(shù)編碼。
我們要知道,一張圖片里可以包含很多很多個8×8的小方塊,都進行上述處理后,就有很多很多個DC系數(shù)。
我們把這很多很多個DC系數(shù)抽出來,組成一個集體,然后對它們進行差分編碼和哈夫曼編碼。
至于其他的AC系數(shù),我們對他們進行行程編碼。
這樣,JPEG標準的壓縮步驟基本就走完了。
這些步驟走完后,壓縮成的.JPG文件體積就會比原圖小很多,當然圖片質(zhì)量也會有所損失。
但我們要說的還沒完。
上面三種無損壓縮編碼的操作過程大家不需要知道,但是他們的壓縮思想,大家是有必要知道的。
差分編碼,就是對于一串數(shù)字,除了第一個數(shù)字,其他數(shù)字都表示為它和前一個數(shù)字的差。例如100、101、103、104、107這串數(shù)據(jù),可以表示為100、1、2、1、3。這就起到了壓縮作用。
哈夫曼編碼,它的大體思想在一串數(shù)據(jù)里,用短字符表示出現(xiàn)頻率多的數(shù)字,用稍長的字符表示出現(xiàn)頻率少的數(shù)字。
假如有下面這句話:“IT之家網(wǎng)友在IT之家討論IT之家小編”,這句話里“IT之家”幾個字反復(fù)出現(xiàn),那我們就用“1”來表示“IT之家”,然后這句話就成了“1網(wǎng)友在1討論1小編”,這樣是不是就被壓縮了?
注意,上面這個例子并不嚴謹,只是為了方便大家理解哈夫曼編碼的思想,實際操作很復(fù)雜的,要考慮概率、做二叉樹等步驟的。如果有IT之家小伙伴感興趣可自行學(xué)習(xí)。
行程編碼,這就很簡單了,直接用例子說明。假如有一串字符“aaabbbccccdddddd”,它包括3個a,3個b,4個c,6個d,所以就把它編碼為“3a3b4c6d”。
很明顯,要想讓這些無損編碼最大限度發(fā)揮壓縮作用,需要保證數(shù)據(jù)有一定特性,例如大面積相同的字符、有很多出現(xiàn)頻率較高的字符或者有很多相似的字符等。
講到這,相信大家也就理解了為什么前面要大費周章做那么多有損的處理了,一部分原因就是為了得到適合進行無損壓縮的數(shù)據(jù)。
通常情況下,一張圖片里面,其實是有很多相同或相近的像素點的,這意味著它們背后的數(shù)據(jù)有很大可以壓縮的空間。
JPEG目的就是要干這個事兒的,這么說相信大家能理解。
說了那么多JPEG,那HEIF呢?
別急,當我們掌握了JPEG圖像壓縮的方法,對于HEIF是怎樣進一步壓縮圖片體積的,就好理解多了。
其實HEIF做的工作和JPEG差不多,大體路徑是相似的,但在一些一些細節(jié)上有改進。
我們需要先做一個簡單的說明。其實所謂的HEIF,是圖片的封裝格式,它主要采用的是一種叫HEVC的編碼方式。
打個比方,一張圖片的信息,它們其實是經(jīng)過HEVC的編碼方式進行編碼,然后將編碼后的信息用一個盒子(容器)裝起來,這個盒子就叫HEIF。
HEIF是把盒子和編碼方式分開了,而JPEG沒有。
HEIF的這種操作方式和很多視頻格式很像,我們經(jīng)常看到的MP4、MKV、AVI等視頻格式,其實都是盒子的名字,盒子里面是編碼的方式,例如MPEG-4、H.264、H.265等。
影音軟件播放視頻文件的時候,都是先把盒子打開,然后再解碼里面的編碼文件。
上面提到的H.265還有一個名字,就叫HEVC,沒錯,也就是HEIF格式主要采用的編碼方式,所以說這個圖片格式其實采用的也是視頻的編碼的方式。
除了HEVC,HEIF格式也可能采用其他的編碼方式,但很少見。它的編碼方式和對應(yīng)的后綴名如下:
我們看到,小米10和iPhone用的都是HEVC的編碼方式,后綴名都是.HEIC。
所以問題就變成了,HEVC的編碼方式是怎么將體積縮小的呢?
其實主要有兩點。
首先,根據(jù)上文的介紹,JPEG是將圖片劃分成很多8×8的像素塊來進行壓縮編碼的。
而在HEVC編碼方式中,這個像素塊的劃分方式更靈活,最大可以允許以64×64來劃分,然后在64×64的像素塊中,可以靈活的劃分子像素塊,可以劃分成32×32、16×16、8×8的子塊,這叫做四叉樹單元劃分。
這么做有什么好處呢?答案就是,在面對一張圖片的時候,如果是信息量比較平緩的區(qū)域,我們可以用比較大的像素塊來劃分,如果是信息量比較密集的區(qū)域,就可以用比較小的像素塊來劃分。
這種根據(jù)實際情況來劃分的編碼單元,可以很大程度提高編碼效率。特別是針對4K等高分辨率、像素量大的照片,優(yōu)勢更明顯。
HEIF照片的文件體積能夠縮小,大部分要歸結(jié)于此。
其次是第二點。前面介紹JPEG時我們講了它使用的幾種無損編碼方式,分別是差分編碼、哈夫曼編碼和行程編碼。
這其中從編碼之后的數(shù)據(jù)量來說,其實最主要的是哈夫曼編碼,它是可以改進的。
在HEIF標準中,這種無損編碼方式主要采用了自適應(yīng)的二進制算術(shù)編碼(下面簡稱“算術(shù)編碼”)。
其實,隨著JPEG跟隨時代的發(fā)展,算術(shù)編碼也被引入到了JPEG的編碼方式中,但是主要還是哈夫曼編碼。
算術(shù)編碼相比哈夫曼編碼,可以進一步提高編碼效率。
其實算術(shù)編碼的思想原理和哈夫曼編碼是差不多的,都是考慮數(shù)據(jù)中不同字符出現(xiàn)的概率,然后給不同字符以不同的編碼。
算術(shù)編碼具體的數(shù)學(xué)化思想很濃,難以三言兩語講清楚,這里也不方便展開說了??傊阈g(shù)編碼最后得到的是一個很簡潔,但是很長的小數(shù)。
正是因為數(shù)學(xué)的思想很深刻,算術(shù)編碼的編碼效率要比哈夫曼編碼更高,最后呈現(xiàn)在大家面前的,就是對于同一張照片可以壓縮成更小的體積。
以上,基本上就是HEIF能夠在保證畫質(zhì)不變的前提下縮小圖片體積的原因了。
最后,關(guān)于HEIF,還有一些比較基礎(chǔ)的知識,大家可以比較輕松地了解到。IT之家之前也轉(zhuǎn)了小米官方對HEIF格式介紹的文章。
HEIF的全名是高效率圖像格式(High Efficiency Image Format),是運動圖像專家組(MPEG)在2013年推出的。它和前面的JPEG不是一個組織。
值得一提的是,HEIF的相關(guān)技術(shù)是諾基亞的技術(shù)人員制定的,在2015年基本定型,現(xiàn)在也是諾基亞在維護(HEIF官網(wǎng):點此前往)。
有意思的是,HEIF的關(guān)鍵編碼技術(shù)HEVC,華為正是主要推動者之一,手握大量專利,還在今年1月加入了HEVC Advance專利池。HEVC Advance專利池中的關(guān)鍵成員還有三星、聯(lián)發(fā)科、皇家飛利浦等等。
當然啦,小米10憑借自身的話題性,對HEIF圖片格式的進一步普及確實也起到了推動作用。
無論如何,汐元還是期待HEIF圖片格式能夠克服困難,盡快普及,畢竟現(xiàn)在智能手機攝像頭像素已經(jīng)能達到億級了,JPG格式下手機的存儲空間確實吃緊。
畢竟,總不能只因為要存照片就非得買更大存儲空間的手機吧。
參考
中國大學(xué)MOOC-長江大學(xué)公開課,2019-08-05,《靜態(tài)圖像壓縮技術(shù):JPEG編碼(視頻)》。
中國大學(xué)MOOC-長江大學(xué)公開課,2019-08-05,《靜態(tài)圖像壓縮技術(shù):Huffman編碼》。
金山視頻云,2017-11-14,《HEIF格式解析》。
CSDN-打怪升級ing,2018-11-29,《H.264和H.265(HEVC)深度解析及對比》。
廣告聲明:文內(nèi)含有的對外跳轉(zhuǎn)鏈接(包括不限于超鏈接、二維碼、口令等形式),用于傳遞更多信息,節(jié)省甄選時間,結(jié)果僅供參考,IT之家所有文章均包含本聲明。