Формат HEIC
High Efficiency Image Container
Контейнер ISOBMFF
Якщо ви колись мали справу з відеофайлами MP4, HEIC здасться вам знайомим. Apple обрала для HEIC формат ISO Base Media File Format (ISOBMFF), тобто спорідненість у нього радше з відеоформатами, ніж із класичними форматами зображень на кшталт JPEG чи PNG.
Формат складається із вкладених «боксів» (їх ще звуть атомами) із чотирисимвольними кодами типу. Це напрочуд елегантна конструкція, яка дозволяє будувати складні ієрархії даних і водночас лишається доволі простою для розбору, щойно ви розберетеся з основами.
Структура файлу HEIC
Заголовок HEIC (бокс ftyp)
| Offset | Hex | ASCII | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 000000186674797068656963 | ....ftypheic | |||||||||||
| 000C | 000000006D69663168656963 | ....mif1heic | |||||||||||
Будова боксу
Якщо size = 1, після типу йде 8-байтовий розширений розмір. Якщо size = 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 (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][0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00...]
Чому саме перезапис нулями?
- • файл лишається цілісним:усі зміщення залишаються дійсними
- • жодного перестиснення:дані зображення недоторкані
- • метадані знищено:нулі не несуть жодної інформації
- • чи можна це відкотити?:ні, перезаписані дані зникли назавжди
Як PicScrub обробляє HEIC
Розбираємо структуру боксів
Рекурсивно проходимо ftyp, meta й знаходимо всі бокси
Знаходимо метадані
Шукаємо властивості Exif і XMP у контейнері ipco
Обнуляємо вміст метаданих
Перезаписуємо вміст боксів з метаданими нулями
Зберігаємо структуру
Залишаємо заголовки боксів, їхні розміри й усі зміщення без змін
Що з розміром файлу
Оскільки PicScrub перезаписує метадані нулями, а не видаляє їх, вихідний файл важитиме стільки ж, скільки й початковий. Місце під метадані залишається, але заповнюється нулями.
HEIC проти HEIF і AVIF
Назви заплутані, тож розберімося. HEIF це формат контейнера, а HEIC та AVIF описують, яким кодеком стиснуто зображення всередині цього контейнера.
| Формат | Контейнер | Кодек | Де використовується |
|---|---|---|---|
| HEIC | HEIF | HEVC (H.265) | Пристрої Apple |
| HEIF | HEIF | Різні | Універсальний контейнер |
| AVIF | HEIF | AV1 | Веб (без ліцензійних відрахувань) |
Усі три використовують ту саму структуру контейнера ISOBMFF/HEIF, тож підхід PicScrub працює для кожного з них.