解密三星蘋果和小米10 用的HEIF照片格式,諾基亞華為貢獻大

前段時間發布的小米10系列手機採用了一種新的圖片格式:HEIF,能夠在保持畫質不變的前提下縮減至少50%的文件體積。

▲圖自:HEIF官網

HEIF格式照片的文件擴展名一般是.HEIC(也有其他的格式)。看到這個格式名,用iPhone的小夥伴一定很熟悉。

沒錯,蘋果在2017年iOS 11系統上就已經開始支持這種圖片格式,大家可以去翻翻 的老文章(點此前往)。

Windows 10系統和安卓9系統在2018年也開始支持HEIF圖片格式。同年,三星Note9其實也已經支持.HEIC照片。

小米10發布前,雷軍曾表示,等HEIF普及後,估計JPEG和GIF就可以淘汰了。

汐元覺得,未來如果HEIF普及了,也許真的可以取代JPEG和GIF。

說到這裡,相信大家都很好奇,HEIF究竟是怎麼夠做到保證畫質不變而縮小文件體積的?

汐元翻了一下網上的資料,大多沒有明確針對這個問題進行說明。所以這篇文章打算聚焦這個問題來為大家介紹。

為什麼HEIF相比JPEG能夠在畫質不變的情況下將文件體積大幅縮小?

我們首先要明白JPEG的圖片格式具體是怎麼樣的。

所謂JPEG格式的圖片,其實說的是一種圖像壓縮的技術標準,使用這種標準壓縮出來的圖片,就叫「JPEG文件」。

JPEG文件後綴名包括JPG、JPEG、JPE、JFIF以及JIF。都是我們熟悉的。

那麼JPEG標準是怎麼壓縮圖片的呢?

我們知道,一張圖片放大後,就可以看到一個一個的像素點。

每個像素點,都包含了描述這個像素點顏色的一組數值,這個叫色彩空間,例如我們熟悉的RGB色彩空間,還有CMYK色彩空間等。

一般照片用的是RGB色彩空間,而JPEG標準採用的是一種叫做YCbCr的色彩空間。所以壓縮之前,要先進行色彩空間轉換。

▲圖自:wikimedia

YCbCr色彩空間中,中Y表示的是亮度,Cb代表藍色的彩度,Cr表示的是紅色的彩度。

換句話說,Y代表亮度,CbCr代表色彩。

轉換之後,每個像素背後變成了另一組數值。

因為人眼對亮度敏感,對色彩不那麼敏感,所以實際壓縮的時候,JPEG標準不會對亮度信息做太多改變,主要對色彩信息做壓縮。

壓縮有兩種,一種是有損壓縮,一種是無損壓縮。JPEG在壓縮時,兩種都會用,一般先進行有損壓縮,然後進行無損壓縮。

有損壓縮第一步是對Cb通道和Cr通道的色彩數據按照一定的比例進行取樣。這個過程就損失了一部分數據。

第二步,就是將一張圖片中的像素分成無數個8×8像素的方塊,每個方塊里有64個像素,對應64組數據。

然後,將這64組數據進行一種叫離散餘弦變換(DCT)的數學處理,處理後,這64組數據就變成了數據更簡潔一些的係數矩陣。

至於這個離散餘弦變換怎麼搞,就不用了解了,懂高數的 小夥伴可以自行去學習。

總之,在經過DCT變換後,64組像素數值變成了64個係數,這個過程又產生了數據損失。

接下來,對於這一組8×8的序數矩陣,還不能直接處理,要繼續進行一步叫「量化」的處理過程。

量化是怎麼進行的大家不用知道,只需要知道,量化的目的是適當減小矩陣內各個像素點之間的差別。因為人眼對小範圍內差別高的像素區域辨別能力不高,所以不如削減它們的差異。

經過量化處理後,8×8的序數矩陣變成了一組更加簡潔的數字矩陣,有大面積的0。

很顯然,這一步,又損失了一部分數據。

好,走到這一步,接下來就是無損壓縮了。

首先,我們把上一步量化後的8×8數字矩陣提取出來。提取的順序是這樣「Z」字型的。

提取出來後,得到64個數據。這64個數據中,第一個數字叫DC係數編碼,後面63個數字叫AC係數編碼。

我們要知道,一張圖片里可以包含很多很多個8×8的小方塊,都進行上述處理後,就有很多很多個DC係數。

我們把這很多很多個DC係數抽出來,組成一個集體,然後對它們進行差分編碼和哈夫曼編碼。

至於其他的AC係數,我們對他們進行行程編碼。

這樣,JPEG標準的壓縮步驟基本就走完了。

這些步驟走完後,壓縮成的.JPG文件體積就會比原圖小很多,當然圖片質量也會有所損失。

但我們要說的還沒完。

上面三種無損壓縮編碼的操作過程大家不需要知道,但是他們的壓縮思想,大家是有必要知道的。

差分編碼,就是對於一串數字,除了第一個數字,其他數字都表示為它和前一個數字的差。例如100、101、103、104、107這串數據,可以表示為100、1、2、1、3。這就起到了壓縮作用。

哈夫曼編碼,它的大體思想在一串數據里,用短字元表示出現頻率多的數字,用稍長的字元表示出現頻率少的數字。

假如有下面這句話:「 網友在 討論 小編」,這句話里「 」幾個字反覆出現,那我們就用「1」來表示「 」,然後這句話就成了「1網友在1討論1小編」,這樣是不是就被壓縮了?

注意,上面這個例子並不嚴謹,只是為了方便大家理解哈夫曼編碼的思想,實際操作很複雜的,要考慮概率、做二叉樹等步驟的。如果有 小夥伴感興趣可自行學習。

行程編碼,這就很簡單了,直接用例子說明。假如有一串字元「aaabbbccccdddddd」,它包括3個a,3個b,4個c,6個d,所以就把它編碼為「3a3b4c6d」。

很明顯,要想讓這些無損編碼最大限度發揮壓縮作用,需要保證數據有一定特性,例如大面積相同的字元、有很多出現頻率較高的字元或者有很多相似的字元等。

講到這,相信大家也就理解了為什麼前面要大費周章做那麼多有損的處理了,一部分原因就是為了得到適合進行無損壓縮的數據。

通常情況下,一張圖片裡面,其實是有很多相同或相近的像素點的,這意味著它們背後的數據有很大可以壓縮的空間。

JPEG目的就是要干這個事兒的,這麼說相信大家能理解。

說了那麼多JPEG,那HEIF呢?

別急,當我們掌握了JPEG圖像壓縮的方法,對於HEIF是怎樣進一步壓縮圖片體積的,就好理解多了。

其實HEIF做的工作和JPEG差不多,大體路徑是相似的,但在一些一些細節上有改進。

我們需要先做一個簡單的說明。其實所謂的HEIF,是圖片的封裝格式,它主要採用的是一種叫HEVC的編碼方式。

打個比方,一張圖片的信息,它們其實是經過HEVC的編碼方式進行編碼,然後將編碼後的信息用一個盒子(容器)裝起來,這個盒子就叫HEIF。

HEIF是把盒子和編碼方式分開了,而JPEG沒有。

HEIF的這種操作方式和很多視頻格式很像,我們經常看到的MP4、MKV、AVI等視頻格式,其實都是盒子的名字,盒子裡面是編碼的方式,例如MPEG-4、H.264、H.265等。

影音軟體播放視頻文件的時候,都是先把盒子打開,然後再解碼裡面的編碼文件。

上面提到的H.265還有一個名字,就叫HEVC,沒錯,也就是HEIF格式主要採用的編碼方式,所以說這個圖片格式其實採用的也是視頻的編碼的方式。

除了HEVC,HEIF格式也可能採用其他的編碼方式,但很少見。它的編碼方式和對應的後綴名如下:

我們看到,小米10和iPhone用的都是HEVC的編碼方式,後綴名都是.HEIC。

所以問題就變成了,HEVC的編碼方式是怎麼將體積縮小的呢?

其實主要有兩點。

首先,根據上文的介紹,JPEG是將圖片劃分成很多8×8的像素塊來進行壓縮編碼的。

而在HEVC編碼方式中,這個像素塊的劃分方式更靈活,最大可以允許以64×64來劃分,然後在64×64的像素塊中,可以靈活的劃分子像素塊,可以劃分成32×32、16×16、8×8的子塊,這叫做四叉樹單元劃分。

這麼做有什麼好處呢?答案就是,在面對一張圖片的時候,如果是信息量比較平緩的區域,我們可以用比較大的像素塊來劃分,如果是信息量比較密集的區域,就可以用比較小的像素塊來劃分。

這種根據實際情況來劃分的編碼單元,可以很大程度提高編碼效率。特別是針對4K等高解析度、像素量大的照片,優勢更明顯。

HEIF照片的文件體積能夠縮小,大部分要歸結於此。

其次是第二點。前面介紹JPEG時我們講了它使用的幾種無損編碼方式,分別是差分編碼、哈夫曼編碼和行程編碼。

這其中從編碼之後的數據量來說,其實最主要的是哈夫曼編碼,它是可以改進的。

在HEIF標準中,這種無損編碼方式主要採用了自適應的二進位算術編碼(下面簡稱「算術編碼」)。

其實,隨著JPEG跟隨時代的發展,算術編碼也被引入到了JPEG的編碼方式中,但是主要還是哈夫曼編碼。

算術編碼相比哈夫曼編碼,可以進一步提高編碼效率。

其實算術編碼的思想原理和哈夫曼編碼是差不多的,都是考慮數據中不同字元出現的概率,然後給不同字元以不同的編碼。

算術編碼具體的數學化思想很濃,難以三言兩語講清楚,這裡也不方便展開說了。總之,算術編碼最後得到的是一個很簡潔,但是很長的小數。

正是因為數學的思想很深刻,算術編碼的編碼效率要比哈夫曼編碼更高,最後呈現在大家面前的,就是對於同一張照片可以壓縮成更小的體積。

以上,基本上就是HEIF能夠在保證畫質不變的前提下縮小圖片體積的原因了。

最後,關於HEIF,還有一些比較基礎的知識,大家可以比較輕鬆地了解到。 之前也轉了小米官方對HEIF格式介紹的文章

HEIF的全名是高效率圖像格式(High Efficiency Image Format),是運動圖像專家組(MPEG)在2013年推出的。它和前面的JPEG不是一個組織。

值得一提的是,HEIF的相關技術是諾基亞的技術人員制定的,在2015年基本定型,現在也是諾基亞在維護(HEIF官網:點此前往)。

有意思的是,HEIF的關鍵編碼技術HEVC,華為正是主要推動者之一,手握大量專利,還在今年1月加入了HEVC Advance專利池。

當然啦,小米10憑藉自身的話題性,對HEIF圖片格式的進一步普及確實也起到了推動作用。

無論如何,汐元還是期待HEIF圖片格式能夠克服困難,儘快普及,畢竟現在智能手機攝像頭像素已經能達到億級了,JPG格式下手機的存儲空間確實吃緊。

畢竟,總不能只因為要存照片就非得買更大存儲空間的手機吧。

參考