ByteScope

HEIF 檔案格式

High Efficiency Image Format,HEIF 容器的通用靜態影像設定檔。

MIME 類型
image/heif
副檔名
.heif
分類
圖片

Magic number(檔案簽章)

0x0000000466747970ftypISO-BMFF 'ftyp' box
0x000000086D696631mif1brand 'mif1'

關於 HEIF 格式

HEIF 是 HEIC 所用容器的通用靜態影像設定檔,還能存放影像序列與輔助資料。它的 'ftyp' 品牌識別是 'mif1'。這個品牌識別的重點在它「沒說」的部分:跟 heic 或 avif 不同,它完全不主張裡面的圖是用哪種編碼壓的。mif1 檔案承諾的是結構 — 有一個 meta box、影像以 item 的形式存在、而且有指名一個主要 item — 至於編碼是什麼,要之後從每個 item 的類型與屬性去發現。這也是為什麼 mif1 除了自己就是個主要品牌識別之外,還會出現在幾乎每個 HEIC 和 AVIF 的相容品牌識別清單裡。

檔頭結構,一個位元組一個位元組看

位移長度欄位意義
04ftyp box size檔案類型 box 的位元組長度,大端序,含這個欄位本身;一個主要品牌識別加兩個相容品牌識別是二十四。ISO-BMFF 檔案裡每個整數都是大端序,那兩個特殊大小在這裡也一樣適用:1 表示類型後面會有 64 位元的長度,0 表示這個 box 一路延伸到檔案結尾。
44Box type66 74 79 70。規格要求檔案類型 box 必須排第一,所以這是這個格式裡唯一位置可靠固定的欄位。它和 HEIC、AVIF、MP4、MOV、3GP 一字不差地共用,所以光靠它只能把檔案縮小到「某個容器家族」,再多就沒有了。
84Major brand6D 69 66 31 代表靜態影像或影像集合。對應影像序列的是 msf1,代表帶時間軸的內容,結構要求也是另一套。兩個品牌識別都沒有指名編碼,而這正是刻意的設計選擇,也是 HEIF 跟 HEIC、AVIF 分家的地方。
124Minor version純資訊用,慣例上全部是零位元組。它沒有任何結構意義,讀取端也不准拿它當作拒收檔案的理由。
16variableCompatible brands每個品牌識別四個位元組,把 box 剩下的空間填滿。mif1 檔案就是在這裡告訴你它實際裝了什麼 — heic 代表 HEVC item,avif 代表 AV1 item,miaf 代表互通性設定檔 — 而讀取端只要看得懂清單裡任何一個品牌識別,就可以打開檔案。
244Next box size24 位元組的 ftyp 之後,下一個 box 標頭從這裡開始。整個檔案就是靠把每個 box 的大小加到目前位置來走訪的;沒有中央索引,長度一旦錯了也沒有辦法重新同步。
284Next box type通常是 6D 65 74 61 — meta — 有它,這個檔案才是影像檔而不是影片。真正做事的是它底下的子 box:pitm 指名主要 item,iinf 列出所有 item 和它們的四字元編碼類型,iloc 記錄每一個 item 的位元組落在哪裡,iprp 則掛上尺寸、旋轉與色彩資訊。

怎麼跟長得像的格式分開

容易搞混的怎麼分
HEIC位移 8 那四個位元組,沒有別的。68 65 69 63 是一個主張自己的 item 是 HEVC 的檔案;6D 69 66 31 只主張這個結構是 HEIF 影像檔。實務上,主要品牌識別是 mif1、相容清單裡有 heic 的檔案,裝的 HEVC 資料跟主要品牌識別是 heic 的完全一樣,所以轉檔工具應該兩份清單都讀,不要只憑主要品牌識別分支。
AVIF這件事真的很麻煩,因為 AVIF 檔案會把 mif1 列進自己的相容品牌識別 — macOS 產出的 AVIF 位移 8 是 avif、位移 20 是 mif1。掃描整個 ftyp box 找 mif1 的偵測器,會把大部分 AVIF 標成 HEIF。只有位移 8 的主要品牌識別能說明這個檔案主打的是哪種格式,而 meta box 裡的 item 類型才說明實際用了哪種編碼:av01 是 AV1,hvc1 是 HEVC。
Image sequences靜態影像的品牌識別是 mif1,序列的是 msf1,差一個位元組。msf1 檔案裝的是帶時間軸的影像,而且常常在 item 之外還有一套軌結構,只為靜態影像而寫的軟體會畫出第一格然後停住。副檔名一點忙都幫不上,因為兩種通常都寫成 .heif。
MP4位移 4 一模一樣,位移 8 才不同:影片是 isom、mp42 或 avc1,影像是 mif1。結構性的判別法是看最上層有哪些 box — 帶 item 的 meta box 代表這是一張圖,moov 加 trak box 代表這是一部影片 — 而一個 HEIF 在裝影像序列時,合法地可以兩者都有。

常見的壞法

  • 讀取端沒有那個編碼。因為這個品牌識別不綁編碼,成功打開一個 mif1 檔案完全不代表解得開裡面的內容:裝著 AV1 item 的 HEIF 在只實作 HEVC 的軟體上會失敗,反過來也一樣。這種失敗看起來像檔案壞了,其實是能力缺口,讀一下位移 16 的相容品牌識別就找得出來。
  • 截斷。meta box 通常排在影像資料前面,所以 item 的尺寸與屬性完好如初,它們指向的位元組卻不見了。讀取端會報出正確的尺寸然後什麼都畫不出來,或是退回去用內嵌的縮圖 item,看起來一切正常,直到你用原始解析度打開它為止。
  • box 大小和它的酬載對不起來。走訪就只是不斷把長度加上去,所以一個大小錯了,剖析器就會把任意資料當成 box 標頭讀,然後放棄。錯誤訊息會指名它剛好落到的那四個位元組,而那裡通常離真正的損壞處很遠。
  • item 位置指到檔案外面。iloc box 是各自獨立記錄每個 item 的位移與長度的,所以被馬虎的工具組出來或編輯過的檔案,可能列出一個起點超出檔案結尾的主要 item,而它的縮圖卻仍然讀得好好的。結果就是一個預覽正常、打開卻打不開的檔案。
  • 從來沒有宣告主要 item。少了 pitm box,讀取端只能自己猜好幾個 item 裡哪一個才是那張圖,而不同的實作猜法不同 — 一個秀出照片,另一個秀出深度圖或 alpha 輔助影像。每個位元組都合法,檔案就只是顯示成別的東西。

這個格式現在還在用嗎

HEIF 這個品牌識別本身,多半是在某個工具想要這個容器、卻不想承諾用哪種編碼時才會遇到,實務上比建立在它之上的那兩種具名設定檔少見得多。它真正的意義是架構性的:HEIC 和 AVIF 都是 HEIF 檔案,而讓現代手機攝影運作起來的那整套機制 — 一個檔案裡多張影像、深度圖、alpha 輔助影像、HDR 增益圖、縮圖、非破壞性編輯清單、連拍序列,以及靠裁切或旋轉另一個 item、完全不必重新編碼就衍生出來的影像 — 都定義在這裡,不在那兩者裡面。單純的 mif1 檔案真正會出現的地方,是影像處理流程裡的交換或中間格式,以及連拍、堆疊這類影像集合 — 那種場合下,容器裝得下多張相關影像正是使用它的全部理由。拿它來交付則是錯的選擇:只宣稱 mif1 的檔案沒有瀏覽器打得開,要放到網路上就該用 AVIF、WebP 或 JPEG。把這個品牌識別當成一句關於結構的宣告,想知道裡面實際裝了什麼就去看相容品牌識別和 item 類型,出貨前先轉檔。

在這個站上打開 HEIF 檔

這些全部在你的瀏覽器裡跑,檔案不會離開你的電腦。

相關格式

容易和 HEIF 搞混的格式,可以比對它們的開頭位元組。

格式開頭位元組副檔名
HEIC66 74 79 70.heic
AVIF66 74 79 70.avif
MP466 74 79 70.mp4

常見問題

檔案的 magic number 是什麼?

檔案開頭的前幾個位元組,不管檔名寫什麼,它標明的是真正的格式。PNG 一定以 89 50 4E 47 開頭,ZIP 則是 50 4B 03 04。作業系統、瀏覽器和 file 指令讀的都是這幾個位元組,而不是相信副檔名 — 這就是為什麼把檔案改名並不會改變它實際上是什麼。

我要怎麼自己檢查 magic number?

在 macOS 或 Linux 上,xxd -l 16 檔名 會印出前 16 個位元組;在 Windows 上,PowerShell 的 Format-Hex -Path 檔名 -Count 16。或者把檔案丟進本站的檔案類型辨識工具,它會在本機讀取位元組並告訴你是什麼格式,不會上傳任何東西。

為什麼兩種格式的 magic number 會一樣?

因為其中一種是建立在另一種之上。docx、xlsx、pptx、apk、jar 與 epub 骨子裡都是 ZIP 壓縮檔,所以全都以 ZIP 的簽章開頭;要分辨它們得看裡面的項目。Java class 檔和 macOS 的通用二進位檔都以 CA FE BA BE 開頭,靠緊接其後的欄位區分。

有完全沒有 magic number 的檔案嗎?

有。XML、HTML、JSON、SVG、CSV 這類以文字為基礎的格式沒有固定的位元組簽章,所以改用結構來辨識:開頭的 <?xml 宣告、<svg 元素,或是 { 後面接著帶引號的鍵。這種偵測是合理推測而非確定,因此本參考頁會把這些格式標示為結構偵測。

magic number 相符就代表檔案安全嗎?

不代表。它告訴你的是格式,不是內容是否無害 — 一個貨真價實的 PDF 或 docx 仍然可能夾帶惡意內容。辨識真實類型是有用的第一道檢查,尤其在副檔名和位元組不一致的時候,但它不是惡意軟體掃描。

手上有檔案可能是 HEIF?用檔案類型辨識工具查出來 — 它在本機讀取 magic number,不上傳任何東西。或者瀏覽所有格式。