Format HEIC
High Efficiency Image Container
Kontener ISOBMFF
Jeśli zdarzyło ci się pracować z plikami wideo MP4, HEIC wyda ci się znajomy. Apple wybrało dla niego ISO Base Media File Format (ISOBMFF), więc format ten ma więcej wspólnego z formatami wideo niż z klasycznymi formatami obrazu, takimi jak JPEG czy PNG.
Plik składa się z zagnieżdżonych „boxów” (nazywanych też atomami) z czteroznakowymi kodami typu. To zaskakująco elegancki projekt, który pozwala budować złożone hierarchie danych, a mimo to jest stosunkowo łatwy do przeanalizowania, gdy tylko zrozumiesz podstawy.
Struktura pliku HEIC
Nagłówek HEIC (box ftyp)
| Offset | Hex | ASCII | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 000000186674797068656963 | ....ftypheic | |||||||||||
| 000C | 000000006D69663168656963 | ....mif1heic | |||||||||||
Budowa boxa
Jeśli rozmiar = 1, zaraz po typie idzie 8-bajtowy rozmiar rozszerzony. Jeśli rozmiar = 0, box ciągnie się do końca pliku.
Najważniejsze boxy
Hierarchia boxów w plikach HEIC potrafi być głęboka. W przeciwieństwie do JPEG, gdzie metadane siedzą w przewidywalnych miejscach, HEIC zakopuje je kilka poziomów w zagnieżdżonej strukturze. Oto jak łączą się główne elementy.
ftyp:typ pliku
Pierwszy box w pliku. Zawiera markę główną i marki zgodne. Niezbędny do rozpoznania formatu.
heic heix hevc hevx heim heis hevm hevs mif1 msf1meta:pojemnik na metadane
Zawiera wszystkie metadane: położenia elementów, ich właściwości i powiązania. To tutaj siedzą dane EXIF/XMP.
meta (pojemnik na metadane) ├── hdlr (odwołanie do handlera) ├── pitm (ID elementu głównego) ├── iloc (położenia elementów → offsety w mdat) │ └── wpisy [item_id, offset, length] ├── iinf (informacje o elementach → tu szukamy 'Exif') │ └── wpisy infe z typami elementów ├── iprp (właściwości elementów) │ ├── ipco (pojemnik na właściwości) │ │ ├── hvcC (konfiguracja dekodera HEVC) │ │ ├── ispe (wymiary obrazu) │ │ ├── colr (profil ICC, offset+12) │ │ ├── Exif (EXIF w formacie TIFF) │ │ └── pixi (informacje o pikselach) │ └── ipma (powiązania właściwości) └── iref (odwołania między elementami)
mdat:dane multimedialne
Zawiera właściwe dane obrazu zakodowane w HEVC. Box iloc w meta podaje offsety wskazujące na miejsca w mdat.
Metadane w HEIC
Jeśli znasz markery APP z plików JPEG, HEIC podchodzi do sprawy inaczej. Zamiast kolejnych markerów na początku pliku, metadane żyją jako „właściwości elementów” wewnątrz boxa meta. Same dane EXIF są nadal w znajomym formacie TIFF, ale żeby do nich dotrzeć, trzeba najpierw przejść przez hierarchię boxów.
Właściwość EXIF
Zapisana w ipco (pojemniku na właściwości elementów) z typem „Exif”. Zawiera standardowe dane EXIF w formacie TIFF, tak samo jak JPEG.
Właściwość XMP
Metadane oparte na XML, zapisane jako właściwość typu „mime” z typem treści „application/rdf+xml”.
Profil ICC
Profil koloru zapisany w boxie „colr” z typem „prof”.
Dlaczego offsety są tak ważne
Box iloc zawiera dokładne offsety bajtowe wskazujące na mdat. Jeśli rozmiar któregokolwiek boxa się zmieni (na przykład po usunięciu metadanych), offsety trzeba przeliczyć, bo inaczej pliku nie da się odczytać.
Anonimizacja bezstratna
Tu HEIC robi się trudny. Format zaprojektowano z myślą o wydajnym przechowywaniu obrazu i wideo, a nie o łatwym manipulowaniu metadanymi.
Na czym polega problem
Struktura HEIC oparta na offsetach sprawia, że usuwanie bajtów jest ryzykowne. Box iloc zawiera dokładne offsety bajtowe wskazujące na mdat. Wystarczy usunąć jeden box, a offsety przestają się zgadzać i obraz się nie otworzy.
Podejście z nadpisywaniem zerami
Zamiast usuwać boxy z metadanymi, PicScrub nadpisuje ich zawartość zerami, zachowując strukturę i rozmiary boxów.
Po: [Exif][0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00...]
Dlaczego akurat zera?
- • Plik zostaje poprawny:wszystkie offsety dalej się zgadzają
- • Bez rekompresji:dane obrazu nietknięte
- • Metadane zniszczone:zera nie niosą żadnej informacji
- • Odwracalne?:nie, nadpisanych danych nie da się odzyskać
Jak PicScrub przetwarza pliki HEIC
Analiza struktury boxów
Rekurencyjne przejście przez ftyp i meta oraz rozpoznanie wszystkich boxów
Odnalezienie metadanych
Znalezienie właściwości Exif i XMP w pojemniku ipco
Wyzerowanie zawartości metadanych
Nadpisanie zawartości boxów z metadanymi zerami
Zachowanie struktury
Pozostawienie nagłówków boxów, rozmiarów i wszystkich offsetów bez zmian
Uwaga o rozmiarze pliku
Ponieważ PicScrub nadpisuje metadane zerami zamiast je usuwać, plik wyjściowy ma dokładnie taki sam rozmiar jak wejściowy. Miejsce po metadanych zostaje, tylko wypełnione zerami.
HEIC, HEIF i AVIF
Nazewnictwo jest mylące, więc uporządkujmy je. HEIF to kontener, a HEIC i AVIF mówią o tym, jakim kodekiem skompresowano obraz wewnątrz tego kontenera.
| Format | Kontener | Kodek | Gdzie używany |
|---|---|---|---|
| HEIC | HEIF | HEVC (H.265) | Urządzenia Apple |
| HEIF | HEIF | Różne | Kontener ogólnego przeznaczenia |
| AVIF | HEIF | AV1 | Sieć (bez opłat licencyjnych) |
Wszystkie trzy korzystają z tej samej struktury kontenera ISOBMFF/HEIF, więc podejście PicScrub sprawdza się w każdym z nich.