PicScrub logoPicScrub
Wróć do formatów

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

ftyp
meta
mdat
ftyp
24 B
Typ pliku i obsługiwane marki
meta
1000 B
Pojemnik na metadane
mdat
Zmienna długość
Dane multimedialne (HEVC)

Nagłówek HEIC (box ftyp)

Rozmiar boxa (24)
Typ boxa (ftyp)
Marka główna (heic)
Wersja pomocnicza
Zgodna marka (mif1)
Zgodna marka (heic)
OffsetHexASCII
0000
000000186674797068656963
....ftypheic
000C
000000006D69663168656963
....mif1heic

Budowa boxa

RozmiarTypDane
4 bajty (BE)4 bajtyRozmiar - 8

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.

Marki zgodne: heic heix hevc hevx heim heis hevm hevs mif1 msf1

meta: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.

Przed: [Exif][GPS Data: 37.7749, -122.4194][Camera: iPhone]
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

1

Analiza struktury boxów

Rekurencyjne przejście przez ftyp i meta oraz rozpoznanie wszystkich boxów

2

Odnalezienie metadanych

Znalezienie właściwości Exif i XMP w pojemniku ipco

3

Wyzerowanie zawartości metadanych

Nadpisanie zawartości boxów z metadanymi zerami

4

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.

Wejście: 2,5 MB (w tym 50 KB danych EXIF)
Wyjście: 2,5 MB (50 KB zer)

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.

FormatKontenerKodekGdzie używany
HEICHEIFHEVC (H.265)Urządzenia Apple
HEIFHEIFRóżneKontener ogólnego przeznaczenia
AVIFHEIFAV1Sieć (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.