照已經是如今大家日常工作生活中最重要的事情之一,為了提供更好的使用體驗,蘋果在去年iOS 11中換用了HEIF格式作為照片的主要格式,Google則在近日的新一代Android P開發者預覽版系統中加入了HEIF格式的原生支持,移動平臺雖然步伐很快,但如果要桌面的Windows PC上查看這種后綴為.heic格式的照片,則需要額外安裝工具,現在這個問題終于可以得到解決了,微軟已在最新版的Windows 10測試系統中加入了HEIF的支持。
在微軟最新放出的兩個Preview版Windows 10系統中(RS4分支的build 17123、RS5分支的build 17623),已經在自帶相冊中加入了HEIF格式照片的支持,只是Windows 10這兩個preview系統也僅僅只是支持查看HEIF照片,目前還無法直接進行編輯,仍需要用到其它專門工具或插件,當然這至少是個開始。
HEIF全稱為High fficiency Image File Format,這個新格式擁有更高的壓縮率,在保持質量的同時,相比JPEG、PNG格式要占用更少的容量空間,這對于大家日益增長的照片數量有很大的幫助,另外HEIF格式還支持了一些新型照片特性,如深度信息、動態照片、HDR等,這些在手機上已經相當常見。
RS4分支的Windows 10的最終版本為Spring Creator Update,將在4月份正式向大眾用戶推送。至于RS5分支的系統則是Windows 10在今年下半年的更新項目,值得注意的是,這個新版測試除了對新格式照片的支持外,還改進了對Thnderbolt 3外接顯卡塢的連接,現在可以更安全地拔除這類配件。用著舊機不爽的你,是否準備購買一波新裝備啦,想要各類硬件推薦的請找小超哥(微信9501417),也可以讓小超哥拉你進去超能群與其他網友一起聊哦~
前段時間發布的小米10系列手機采用了一種新的圖片格式:HEIF,能夠在保持畫質不變的前提下縮減至少50%的文件體積。
▲圖自:HEIF官網
HEIF格式照片的文件擴展名一般是.HEIC(也有其他的格式)。看到這個格式名,用iPhone的小伙伴一定很熟悉。
沒錯,蘋果在2017年iOS 11系統上就已經開始支持這種圖片格式,大家可以去翻翻IT之家的老文章(點此前往)。
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組數據就變成了數據更簡潔一些的系數矩陣。
至于這個離散余弦變換怎么搞,就不用了解了,懂高數的IT之家小伙伴可以自行去學習。
總之,在經過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。這就起到了壓縮作用。
哈夫曼編碼,它的大體思想在一串數據里,用短字符表示出現頻率多的數字,用稍長的字符表示出現頻率少的數字。
假如有下面這句話:“IT之家網友在IT之家討論IT之家小編”,這句話里“IT之家”幾個字反復出現,那我們就用“1”來表示“IT之家”,然后這句話就成了“1網友在1討論1小編”,這樣是不是就被壓縮了?
注意,上面這個例子并不嚴謹,只是為了方便大家理解哈夫曼編碼的思想,實際操作很復雜的,要考慮概率、做二叉樹等步驟的。如果有IT之家小伙伴感興趣可自行學習。
行程編碼,這就很簡單了,直接用例子說明。假如有一串字符“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,還有一些比較基礎的知識,大家可以比較輕松地了解到。IT之家之前也轉了小米官方對HEIF格式介紹的文章。
HEIF的全名是高效率圖像格式(High Efficiency Image Format),是運動圖像專家組(MPEG)在2013年推出的。它和前面的JPEG不是一個組織。
值得一提的是,HEIF的相關技術是諾基亞的技術人員制定的,在2015年基本定型,現在也是諾基亞在維護(HEIF官網:點此前往)。
有意思的是,HEIF的關鍵編碼技術HEVC,華為正是主要推動者之一,手握大量專利,還在今年1月加入了HEVC Advance專利池。
當然啦,小米10憑借自身的話題性,對HEIF圖片格式的進一步普及確實也起到了推動作用。
無論如何,汐元還是期待HEIF圖片格式能夠克服困難,盡快普及,畢竟現在智能手機攝像頭像素已經能達到億級了,JPG格式下手機的存儲空間確實吃緊。
畢竟,總不能只因為要存照片就非得買更大存儲空間的手機吧。
參考