PicScrub logoPicScrub
Повернутися до форматів

Формат HEIC

High Efficiency Image Container

Контейнер ISOBMFF

Якщо ви колись мали справу з відеофайлами MP4, HEIC здасться вам знайомим. Apple обрала для HEIC формат ISO Base Media File Format (ISOBMFF), тобто спорідненість у нього радше з відеоформатами, ніж із класичними форматами зображень на кшталт JPEG чи PNG.

Формат складається із вкладених «боксів» (їх ще звуть атомами) із чотирисимвольними кодами типу. Це напрочуд елегантна конструкція, яка дозволяє будувати складні ієрархії даних і водночас лишається доволі простою для розбору, щойно ви розберетеся з основами.

Структура файлу 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

Якщо size = 1, після типу йде 8-байтовий розширений розмір. Якщо size = 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  (EXIF у форматі TIFF)
│   │   └── pixi  (інформація про пікселі)
│   └── ipma (звʼязки властивостей)
└── iref  (посилання на елементи)

mdat:медіадані

Містить власне дані зображення, закодовані в HEVC. Бокс iloc усередині meta вказує зміщення в mdat.

Метадані в HEIC

Якщо ви звикли до маркерів APP у JPEG, то HEIC діє інакше. Замість послідовних маркерів на початку файлу метадані живуть як «властивості елементів» усередині боксу meta. Самі дані EXIF так само мають звичний формат TIFF, але щоб їх знайти, спершу треба пройти ієрархією боксів.

Властивість EXIF

Зберігається в ipco (контейнері властивостей елементів) із типом «Exif». Містить стандартні дані EXIF у форматі TIFF, так само як у JPEG.

Властивість XMP

Метадані на основі XML, збережені як властивість типу «mime» із content-type «application/rdf+xml».

Профіль ICC

Колірний профіль зберігається в боксі «colr» із типом «prof».

Чому зміщення такі важливі

Бокс iloc містить точні побайтові зміщення, які вказують усередину mdat. Якщо розмір хоч якогось боксу зміниться (наприклад, після видалення метаданих), ці зміщення доведеться перерахувати, інакше файл стане нечитабельним.

Анонімізація без втрат

Ось де з HEIC починаються складнощі. Формат створювали для ефективного зберігання відео й зображень, а не для зручного редагування метаданих.

У чому проблема

Через побудову HEIC на зміщеннях видаляти байти ризиковано. Бокс iloc містить точні побайтові зміщення, які вказують усередину mdat. Приберіть бодай один бокс, і ці зміщення стануть неправильними, а зображення просто не відкриється.

Підхід із перезаписом нулями

Замість видаляти бокси з метаданими, PicScrub перезаписує їхній вміст нулями, зберігаючи структуру й розміри боксів.

До: [Exif][GPS Data: 37.7749, -122.4194][Camera: iPhone]
Після:  [Exif][0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00...]

Чому саме перезапис нулями?

  • • файл лишається цілісним:усі зміщення залишаються дійсними
  • • жодного перестиснення:дані зображення недоторкані
  • • метадані знищено:нулі не несуть жодної інформації
  • • чи можна це відкотити?:ні, перезаписані дані зникли назавжди

Як PicScrub обробляє HEIC

1

Розбираємо структуру боксів

Рекурсивно проходимо ftyp, meta й знаходимо всі бокси

2

Знаходимо метадані

Шукаємо властивості Exif і XMP у контейнері ipco

3

Обнуляємо вміст метаданих

Перезаписуємо вміст боксів з метаданими нулями

4

Зберігаємо структуру

Залишаємо заголовки боксів, їхні розміри й усі зміщення без змін

Що з розміром файлу

Оскільки PicScrub перезаписує метадані нулями, а не видаляє їх, вихідний файл важитиме стільки ж, скільки й початковий. Місце під метадані залишається, але заповнюється нулями.

На вході: 2,5 МБ (з 50 КБ EXIF)
На виході: 2,5 МБ (50 КБ нулів)

HEIC проти HEIF і AVIF

Назви заплутані, тож розберімося. HEIF це формат контейнера, а HEIC та AVIF описують, яким кодеком стиснуто зображення всередині цього контейнера.

ФорматКонтейнерКодекДе використовується
HEICHEIFHEVC (H.265)Пристрої Apple
HEIFHEIFРізніУніверсальний контейнер
AVIFHEIFAV1Веб (без ліцензійних відрахувань)

Усі три використовують ту саму структуру контейнера ISOBMFF/HEIF, тож підхід PicScrub працює для кожного з них.