HEIC 形式
High Efficiency Image Container
ISOBMFF コンテナ
MP4 の動画ファイルを触ったことがあるなら、HEIC は見覚えのある形に 感じられるはずです。Apple は HEIC のコンテナに ISO Base Media File Format(ISOBMFF)を選びました。つまり JPEG や PNG のような従来の 画像形式ではなく、動画形式と血がつながっているのです。
構造は、4 文字の種別コードを持つ「ボックス」(アトムとも呼ばれます)の 入れ子でできています。基本さえ分かれば解析しやすく、それでいて複雑な 階層を表現できる、驚くほどよくできた設計です。
HEIC のファイル構造
HEIC のヘッダー(ftyp ボックス)
| Offset | Hex | ASCII | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 000000186674797068656963 | ....ftypheic | |||||||||||
| 000C | 000000006D69663168656963 | ....mif1heic | |||||||||||
ボックスの構造
サイズが 1 なら、種別のあとに 8 バイトの拡張サイズが続きます。 サイズが 0 なら、そのボックスはファイル末尾まで続きます。
主なボックス
HEIC のボックス階層はかなり深くなることがあります。メタデータが 決まった位置にある JPEG と違い、HEIC はメタデータを入れ子構造の 何層も奥に埋めています。主な部品がどう組み合わさっているかを見てみましょう。
ftyp:ファイル種別
ファイルの先頭にあるボックス。メジャーブランドと互換ブランドが 入っています。形式を判別するために必須です。
heic heix hevc hevx heim heis hevm hevs mif1 msf1meta:メタデータのコンテナ
アイテムの位置、プロパティ、関連付けなど、メタデータのすべてが 入っています。EXIF や XMP のデータもここにあります。
meta (メタデータのコンテナ) ├── hdlr (ハンドラの参照) ├── pitm (主アイテムの ID) ├── iloc (アイテムの位置 → mdat 内のオフセット) │ └── [item_id, offset, length] のエントリ ├── iinf (アイテム情報 → 'Exif' アイテムを探す) │ └── アイテム種別を持つ infe エントリ ├── iprp (アイテムのプロパティ) │ ├── ipco (プロパティのコンテナ) │ │ ├── hvcC (HEVC デコーダの設定) │ │ ├── ispe (画像のサイズ) │ │ ├── colr (ICC プロファイル、offset+12) │ │ ├── Exif (TIFF 形式の EXIF) │ │ └── pixi (画素の情報) │ └── ipma (プロパティの関連付け) └── iref (アイテムの参照)
mdat:メディアデータ
HEVC で符号化された画像データそのものが入ります。meta の中の iloc ボックスが mdat 内の位置を示します。
HEIC の中のメタデータ
JPEG の APP マーカーに慣れていると、HEIC のやり方はずいぶん違って 見えます。ファイル先頭にマーカーが並ぶのではなく、meta ボックスの中の 「アイテムプロパティ」としてメタデータが置かれます。EXIF データ自体は おなじみの TIFF 形式ですが、たどり着くにはまずボックスの階層を かき分けていく必要があります。
EXIF のプロパティ
ipco(アイテムプロパティのコンテナ)に「Exif」という種別で 格納されます。中身は JPEG と同じ、TIFF 形式の標準的な EXIF データです。
XMP のプロパティ
XML ベースのメタデータ。content-type が 「application/rdf+xml」の「mime」種別のプロパティとして格納されます。
ICC プロファイル
カラープロファイルは、種別が「prof」の「colr」ボックスに入ります。
オフセットが重要な理由
iloc ボックスには、mdat 内を正確に指し示すバイトオフセットが 入っています。メタデータの削除などでボックスのサイズが変われば、 これらのオフセットも計算し直さなければ、ファイルは読めなくなります。
劣化なしの匿名化
HEIC がやっかいなのはここからです。この形式は動画や画像を効率よく 保存するために設計されたもので、メタデータをいじりやすくするための ものではありません。
難しいところ
オフセットに依存した HEIC の構造では、バイトを取り除くのは危険です。 iloc ボックスには mdat 内を正確に指すバイトオフセットが入っており、 ボックスをひとつ削除しただけでそれらがずれてしまい、 画像が開けなくなります。
ゼロで上書きするやり方
PicScrub はメタデータのボックスを削除するのではなく、ボックスの 構造とサイズを保ったまま中身をゼロで上書きします。
After: [Exif][0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00...]
なぜゼロで上書きするのか
- • ファイルの整合性を保てる:オフセットは すべて有効なまま
- • 再圧縮なし:画像データには触れません
- • メタデータは消える:ゼロには何の情報も ありません
- • 元に戻せる?:いいえ、上書きしたデータは 戻りません
PicScrub が HEIC を処理する流れ
ボックス構造の解析
ftyp と meta を再帰的にたどり、すべてのボックスを洗い出します
メタデータの特定
ipco コンテナの中から Exif と XMP のプロパティを見つけます
メタデータをゼロに
メタデータのボックスの中身をゼロで上書きします
構造はそのまま
ボックスのヘッダー、サイズ、オフセットはすべて変えません
ファイルサイズについて
PicScrub は削除ではなくゼロ上書きを使うので、出力されるファイルの サイズは入力と同じになります。メタデータの領域はそのまま残り、 中身がゼロで埋められます。
HEIC と HEIF と AVIF
名前がややこしいので整理しておきましょう。HEIF はコンテナの形式で、 HEIC や AVIF は、そのコンテナの中の画像をどのコーデックで圧縮したかを 表しています。
| 形式 | コンテナ | コーデック | 主な使われ方 |
|---|---|---|---|
| HEIC | HEIF | HEVC (H.265) | Apple の端末 |
| HEIF | HEIF | さまざま | 汎用のコンテナ |
| AVIF | HEIF | AV1 | ウェブ(ロイヤリティフリー) |
3 つとも同じ ISOBMFF/HEIF のコンテナ構造を使っているので、 PicScrub のやり方はそのすべてに通用します。