PicScrub logoPicScrub
対応形式に戻る

HEIC 形式

High Efficiency Image Container

ISOBMFF コンテナ

MP4 の動画ファイルを触ったことがあるなら、HEIC は見覚えのある形に 感じられるはずです。Apple は HEIC のコンテナに ISO Base Media File Format(ISOBMFF)を選びました。つまり JPEG や PNG のような従来の 画像形式ではなく、動画形式と血がつながっているのです。

構造は、4 文字の種別コードを持つ「ボックス」(アトムとも呼ばれます)の 入れ子でできています。基本さえ分かれば解析しやすく、それでいて複雑な 階層を表現できる、驚くほどよくできた設計です。

HEIC のファイル構造

ftyp
meta
mdat
ftyp
24 バイト
ファイル種別とブランド
meta
1000 バイト
メタデータのコンテナ
mdat
可変長
メディアデータ(HEVC)

HEIC のヘッダー(ftyp ボックス)

ボックスのサイズ(24)
ボックスの種別(ftyp)
メジャーブランド(heic)
マイナーバージョン
互換ブランド(mif1)
互換ブランド(heic)
OffsetHexASCII
0000
000000186674797068656963
....ftypheic
000C
000000006D69663168656963
....mif1heic

ボックスの構造

SizeTypeData
4 バイト (BE)4 バイトサイズ - 8

サイズが 1 なら、種別のあとに 8 バイトの拡張サイズが続きます。 サイズが 0 なら、そのボックスはファイル末尾まで続きます。

主なボックス

HEIC のボックス階層はかなり深くなることがあります。メタデータが 決まった位置にある JPEG と違い、HEIC はメタデータを入れ子構造の 何層も奥に埋めています。主な部品がどう組み合わさっているかを見てみましょう。

ftyp:ファイル種別

ファイルの先頭にあるボックス。メジャーブランドと互換ブランドが 入っています。形式を判別するために必須です。

互換ブランド: heic heix hevc hevx heim heis hevm hevs mif1 msf1

meta:メタデータのコンテナ

アイテムの位置、プロパティ、関連付けなど、メタデータのすべてが 入っています。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 はメタデータのボックスを削除するのではなく、ボックスの 構造とサイズを保ったまま中身をゼロで上書きします。

Before: [Exif][GPS Data: 37.7749, -122.4194][Camera: iPhone]
After:  [Exif][0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00...]

なぜゼロで上書きするのか

  • • ファイルの整合性を保てる:オフセットは すべて有効なまま
  • • 再圧縮なし:画像データには触れません
  • • メタデータは消える:ゼロには何の情報も ありません
  • • 元に戻せる?:いいえ、上書きしたデータは 戻りません

PicScrub が HEIC を処理する流れ

1

ボックス構造の解析

ftyp と meta を再帰的にたどり、すべてのボックスを洗い出します

2

メタデータの特定

ipco コンテナの中から Exif と XMP のプロパティを見つけます

3

メタデータをゼロに

メタデータのボックスの中身をゼロで上書きします

4

構造はそのまま

ボックスのヘッダー、サイズ、オフセットはすべて変えません

ファイルサイズについて

PicScrub は削除ではなくゼロ上書きを使うので、出力されるファイルの サイズは入力と同じになります。メタデータの領域はそのまま残り、 中身がゼロで埋められます。

入力: 2.5 MB(うち 50KB が EXIF)
出力: 2.5 MB(50KB は ゼロ)

HEIC と HEIF と AVIF

名前がややこしいので整理しておきましょう。HEIF はコンテナの形式で、 HEIC や AVIF は、そのコンテナの中の画像をどのコーデックで圧縮したかを 表しています。

形式コンテナコーデック主な使われ方
HEICHEIFHEVC (H.265)Apple の端末
HEIFHEIFさまざま汎用のコンテナ
AVIFHEIFAV1ウェブ(ロイヤリティフリー)

3 つとも同じ ISOBMFF/HEIF のコンテナ構造を使っているので、 PicScrub のやり方はそのすべてに通用します。