在升級(jí) iOS 11 之后,iPhone 7 及更新的設(shè)備內(nèi)的照片存儲(chǔ)將不再用 JPEG 了,而采用了一種新的圖片格式 HEIF(發(fā)音同 heef),在 iOS 中對(duì)應(yīng)的文件后綴為 .heic ,其編碼用的是 HEVC(這個(gè)發(fā)不了音,哈哈哈)格式,又稱 H.265 (這個(gè)就很熟悉了 H.264 的下一代),同時(shí)視頻也用 HEVC 作為編碼器,對(duì)應(yīng)的文件后綴還是 .mov 。
這里要注意他們倆的關(guān)系, HEIF 是圖片格式,而 HEVC 是編碼格式(類似 H.264,VP8),HEIF 是圖片容器(類似于視頻的 mkv,mp4 后綴),而用 HEVC 進(jìn)行編碼的 HEIF 圖片就是后綴為 .heic 的圖片,也是蘋果主要使用的格式。
這兩個(gè)都是很新的標(biāo)準(zhǔn),分別在 2015 和 2013 年才被 ISO 批準(zhǔn)。這篇文章主要介紹一下 HEIF 格式和與其他圖片格式相比的優(yōu)劣。
發(fā)展史如下:
圖1
HEIF 全稱 High Efficiency Image Format (HEIF)。是由 Moving Picture Experts Group 制定的,存儲(chǔ)圖片和圖片序列的格式。
相關(guān)的介紹位置這邊可以看到 https://nokiatech.github.io/heif/ ,對(duì)的,你沒有看錯(cuò),是 Nokia 的技術(shù)人員們制定的。相比 JPEG ,PNG 等傳統(tǒng)的圖片格式來說, HEIF 可算是相當(dāng)年輕了,但是這種格式相比 JPEG 等有很多的優(yōu)點(diǎn)。
圖2
在這個(gè) Nokia 網(wǎng)站上可以看到相關(guān)的例子。
在視頻文件中,容器和編碼是獨(dú)立開的,比如 mp4,mkv 等格式是容器,而 H.264,VP8 等是編碼。但是圖像文件中,像 JPEG 就是混合在一起的(所以它不好用啊,哈哈哈哈),HEIF 就把容器和編碼分開了,有用來存放單個(gè)或者多個(gè)圖像的容器。
所以基于不同的編碼器,會(huì)有不同的文件后綴。
編碼器 | 單文件后綴 | 連續(xù)圖片后綴 |
---|---|---|
HEVC | .HEIC | .HEICS |
H.264 | .AVCI | .AVCS |
Any codec | .HEIF | .HEIFS |
Apple 設(shè)備中默認(rèn)使用的都是 HEVC 的編碼的 HEIF 格式。
在 Apple 所編碼的 HEIF 的文件組成大致如下圖,其 mdat – Media Data 中存放的是 exif 信息,縮略圖(320*240),和 HEVC 編碼后的圖片:
圖3
HEIF 底層是默認(rèn) tiled,就是片狀的有 512×512 個(gè),由一個(gè)個(gè)小的圖塊,組成一張大圖,這一特性有如下的優(yōu)點(diǎn):
HeifTile 和 SystemTile (CATiledLayer 等系統(tǒng)所提供的分塊加載)是不一樣的,但是兩者結(jié)合會(huì)有很大的提升,所以在加載和處理特大圖片時(shí),性能有大幅度的提升。
每當(dāng)一個(gè)新的技術(shù)推進(jìn)至工業(yè)化,兼容性無疑是最重要的考量點(diǎn)。像 HEIF 這樣的圖片格式,并不像 JPEG / PNG 等已經(jīng)被廣泛應(yīng)用和適配了,估計(jì)在 Apple 推出之前,大部分開發(fā)者和我一樣應(yīng)該都是不知道的。目前工業(yè)化的體系內(nèi),對(duì) HEIF 幾乎是不兼容,Windows 上無法打開 HEIF 文件,10.13 前的 macOS 也無法打開。蘋果在推行這一技術(shù)的時(shí)候,在內(nèi)部也是做了很多兼容工作的。
一般情況下,用戶是對(duì)這個(gè)格式無感知的,因?yàn)橹挥性谛驴钪С钟步獯a的 iOS 手機(jī)內(nèi)部是以 heif & hevc 格式來存儲(chǔ)照片和視頻的,而在用戶通過 Airdrop 或者數(shù)據(jù)線傳送到電腦上的時(shí)候,對(duì)不兼容的設(shè)備會(huì)自動(dòng)轉(zhuǎn)換到 JPEG 的格式。所以也不會(huì)影響你使用微信,微博等軟件。
不過在蘋果內(nèi)部的 app 中,基本都已經(jīng)用上了這一技術(shù),如照片,F(xiàn)aceTime 等應(yīng)用。意味著以后同等儲(chǔ)存空間能存放更多的照片和視頻,同時(shí) FaceTime 也能節(jié)省更多了流量,相同網(wǎng)絡(luò)情況下,F(xiàn)aceTime 也會(huì)更加清晰。
通過在 設(shè)置 -> 照片 選項(xiàng)中可以設(shè)置傳到 MAC 或者 PC 上時(shí)保持 HEIF 格式。
圖4
軟件:iOS11,運(yùn)行 macOS 系統(tǒng)的 Mac 設(shè)備。
解碼:
硬件:A9 及以上芯片 iOS 設(shè)備(iPhone6s),配備 6 代及以上 Inter Core 處理(Skylake)。
軟件:iOS11 和 macOS 支持軟解碼,但是 iOS11 鎖版本代表最低只支持到 5s 。
HECV 視頻:
視頻分為 8 位 / 10 位 兩種模式。
基本和圖片編解碼保持一致,唯一有區(qū)別的是 10 位硬解碼要求是 7 代 Intel 處理器。
總結(jié)一下,就是升到iOS 11之后,你的設(shè)備就能解析新格式的圖片和視頻,軟硬解碼的區(qū)別就是,硬解碼會(huì)更快并更省電。
對(duì)用戶的幾乎無感知切換的前提,肯定是上層 API 沒有變化,調(diào)整的是最底層的 API,所以一般開發(fā)者使用上層的框架時(shí),如 PhotoKIt 是不受影響的,不同格式的圖片都抽象為了同一個(gè)對(duì)象。而且對(duì)圖片增加濾鏡和視頻的調(diào)整修改,最后都會(huì)渲染為 JPEG 和 H.264。在這一級(jí)別的 API 是接觸不到圖片文件格式轉(zhuǎn)換所帶來的變化的。
Image I/O 中可以直接讀寫 .heic 文件。
iOS 11 中 Image I/O 能夠直接讀取 heif 的文件,包括讀取 exif,xmp 等信息。
let inputURL = URL(fileURLWithPath:Bundle.main.resourcePath! + "/IMG_0513.HEIC")let source = CGImageSourceCreateWithURL(inputURL as CFURL, nil)let image = CGImageSourceCreateImageAtIndex(source!, 0, nil)let options = [kCGImageSourceCreateThumbnailFromImageIfAbsent as String: true, kCGImageSourceThumbnailMaxPixelSize as String: 320] as [String: Any]let thumb = CGImageSourceCreateThumbnailAtIndex(source!, 0, options as CFDictionary)guard let cImage = image else {print("not support heic")return;}
當(dāng)然也可以選擇把 CGImage 寫入到 HEIC 格式,雖然這樣可以節(jié)約更多的存儲(chǔ)空間,實(shí)際使用的時(shí)候還是要注意轉(zhuǎn)換操作。
let url = URL(fileURLWithPath: "/tmp/output.heic")guard let destination = CGImageDestinationCreateWithURL(url as CFURL,AVFileType.heic as CFString, 1, nil) else{fatalError("unable to create CGImageDestination")}CGImageDestinationAddImage(imageDestination, image, nil) CGImageDestinationFinalize(imageDestination)
Apple 提供的很多 API ,供開發(fā)者檢測(cè)設(shè)備是否支持新的格式。提供了兩種推薦的工作場(chǎng)景事例。
社交網(wǎng)絡(luò)
在社交軟件中,涉及到圖片分享之類的內(nèi)容,是無法確定接受者是否能支持新的格式的, Apple 的策略是建議都進(jìn)行轉(zhuǎn)換到 JPEG 的操作,比如發(fā)送郵件,或者通過 extension 分享的時(shí)候,傳入其他 app 中的時(shí)候,都已經(jīng)進(jìn)行了轉(zhuǎn)換了。
p2p 場(chǎng)景
在該場(chǎng)景中,設(shè)備和設(shè)備間的直接連接,首先把接受者的支持格式告知發(fā)送者,然后發(fā)送者根據(jù)兼容的情況,選擇 HEIF 或者 JPEG。比如 AirDrop 。
同時(shí)諸如 SDWebImage 目前也正在做對(duì) heif 的兼容。
大部分的播放器已經(jīng)支持了 HEVC 即 H.265 的編碼器,但是針對(duì) HEIF 的圖片兼容性還是相對(duì)較差的。
目前有的是 Nokia 提供了一個(gè) C++ 的讀寫庫,通過該庫,支持把 HEIF 的圖片的解碼到 HEVC 的編碼數(shù)據(jù)。
據(jù)說 LG 正在研發(fā)支持硬解的手機(jī)。(raddit)
網(wǎng)頁兼容性:
Nokia 提供 JS 庫。
Windows 兼容性:
目前也沒有能直接打開 HEIF 文件的應(yīng)用
常常拿來與 HEVC 來做對(duì)比的是 VP9。兩者的性能相近,但是 VP9 是開源的,而 HEVC 是需要專利費(fèi)的( $2 每設(shè)備)。
目前暫時(shí)沒有通過 VP9 進(jìn)行編碼的圖片,所以這里主要對(duì)比的是 webp 就是通過 VP8 進(jìn)行編碼的圖片。
webp
WebP目前支持桌面上的Chrome和Opera瀏覽器,手機(jī)支持僅限于原生的Android瀏覽器、Android系統(tǒng)上的Chrome瀏覽器、Opera Mini瀏覽器。
下面是幾個(gè)關(guān)鍵技術(shù)點(diǎn)的對(duì)比,可見 HEIF 功能是最強(qiáng)大的。
.heic | WebP | JPEG |
---|---|---|
最大尺寸 | 無上限 | 16383×16383 |
編碼 | HEVC | VP8 |
是否支持其他編碼 | YES | NO |
支持音頻/文字 | YES | NO |
支持多圖片 | YES | YES |
支持裁剪 | YES | NO |
支持透明 | YES | YES |
支持縮略圖 | YES | NO |
分塊加載 | YES | NO |
下面的數(shù)據(jù)均是官方提出:
Webp 同等質(zhì)量下,比 JPEG 圖像小 25-34%。
JPEG 平均需要比 HEVC 多 139% 的比特率,意味著同等質(zhì)量下,JPEG 的大小是 HEVC 的 2.39 倍!
把兩個(gè)的參考標(biāo)準(zhǔn)統(tǒng)一一下:
Webp 比 JPEG 小 25-34%
HEVC 比 JPEG 小 58%
實(shí)際測(cè)試:webp 以 80 的質(zhì)量進(jìn)行壓縮,hevc 以 crf 18 (視覺無損)壓縮,同時(shí)增加一個(gè) 320×240 的縮略圖。
進(jìn)行 HEIF 轉(zhuǎn)碼的流程是,將圖片通過 ffmpeg 編碼到 H.265,再通過 Nokia 的庫轉(zhuǎn)成 HEIC 文件(Heif)。
//生成主圖像編碼ffmpeg -i $1 -crf 18 -preset slower -pix_fmt yuv420p -f hevc bitstream.265 //生成縮略圖編碼ffmpeg -i $1 -vf scale=320:240 -crf 28 -preset slower -pix_fmt yuv420p -f hevc bitstream.thumb.265//調(diào)用 Nokia 的工具./writerapp config.json
實(shí)際測(cè)試數(shù)據(jù):
格式 | 原圖大小 | heic | webp |
---|---|---|---|
JPEG 4352×3264 | 5.7 MB | 487KB | 538 KB |
JPEG 8688×5792 | 34.7 MB | 3.5 MB | 2.7 MB |
tiff 3840×2160 | 1.8 MB | 238 KB | 264 KB |
PNG 1243×2208 | 1.5 MB | 175 KB | 209 KB |
PNG 512×512 | 243 KB | 13 KB | 14 KB |
除了一組特大圖的表現(xiàn)不一樣外,其他幾組圖片相比, heif 確實(shí)比 webp 壓縮效率高 10-20%。
畢竟和 HEVC 對(duì)標(biāo)的技術(shù)應(yīng)該是 VP9,所以 heif 能夠領(lǐng)先也是情理之中。
主要測(cè)試設(shè)備是 iPhone 6s Plus 系統(tǒng) iOS 11,用的解碼方法 webp 為 Google 提供的庫,hevc 和 jpeg 用的是 CGImageSource 來解碼。
測(cè)試用圖片還是之前的五組圖片,同時(shí)對(duì) JPEG 進(jìn)行了一些壓縮,測(cè)試了 5 組平均值(去一個(gè)最高,去一個(gè)最低),估計(jì)加載的時(shí)候存在緩存,所以第一次讀圖片數(shù)據(jù)的時(shí)候耗時(shí)較大。
第一組用第一張 7.7 mb 的 jpeg 壓縮后大小 1.1mb
jpeg 7.43 2.77 1.46 1.9 2.14 2.00 【占用率 6 %】
hevc 41.0 3.45 3.35 2.62 2.92 2.66 【占用率 6 %】
webp 216.6 216.8 217.5 261.9 195.2 【占用率 21 %】
格式 | 平均時(shí)間 | 占用率 |
---|---|---|
jpeg | 2.20ms | 5 % |
hevc | 3.01ms | 6 % |
webp | 220.1ms | 20% |
第二組用第三張 1.8 mb 的 tff,轉(zhuǎn)換成 jpeg 之后大小為 815 KB。
hevc 58.4 3.1 2.8 1.13 2.65 2.82 2.02 【 2% 】
jpeg 65.3 2.67 2.76 2.73 2.69 2.87 1.34 【 2% 】
webp 130.2 110.9 117.5 114.8 120.9 112.8 124.84 【 12% 】
格式 | 平均時(shí)間 | 占用率 |
---|---|---|
jpeg | 2.73ms | 2 % |
hevc | 2.68ms | 2 % |
webp | 115.58ms | 12% |
第三組用的最后一張 243KB PNG ,轉(zhuǎn)換成 JPEG 之后大小為 43 KB。
hevc 47 3.24 2.7 3.21 2.63 1.74 【 1 %】
jpeg 16 6.70 6.97 4.46 7.2 6.76 7.08 【 1% 】
webp 20.7 20.2 12.5 22.0 19.3 19.4 【 2 % 】
格式 | 平均時(shí)間 | 占用率 |
---|---|---|
jpeg | 6.90ms | 1 % |
hevc | 2.95ms | 1 % |
webp | 20.1ms | 2 % |
測(cè)試結(jié)果由于硬解碼的支持,jpeg 和 hevc 解碼速度和 CPU 占用率都比 webp 快和小很多,jpeg 和 hevc 不相伯仲,可見蘋果內(nèi)部對(duì)齊優(yōu)化也相當(dāng)?shù)轿?,才把它放?iOS 11 中。
相比 JPEG 來比很強(qiáng)大,畢竟是下一代技術(shù),但是兼容性可想而知,在“最大效率”和“最大兼容”兩者中間還是要根據(jù)使用場(chǎng)景進(jìn)行權(quán)衡,目前的優(yōu)勢(shì)也只有最新的 iPhone 能體驗(yàn)到,但不久的將來可能所有的手機(jī)都去支持照片深度,動(dòng)態(tài)照片,更廣的色域等。HEVC 也許和推行 H.264 一樣,逐漸成為了工業(yè)界的標(biāo)準(zhǔn),但又可能和推行 acc 的處境一樣,只是成為了蘋果的標(biāo)準(zhǔn)而已,終究還是要看市場(chǎng)的反應(yīng)了.
聯(lián)系客服