Formato HEIC
High Efficiency Image Container
Contêiner ISOBMFF
Se você já trabalhou com arquivos de vídeo MP4, o HEIC vai parecer familiar. A Apple escolheu o ISO Base Media File Format (ISOBMFF) como contêiner do HEIC, o que significa que ele tem mais em comum com formatos de vídeo do que com formatos de imagem tradicionais, como JPEG ou PNG.
O formato é feito de "caixas" aninhadas (também chamadas de átomos), com códigos de tipo de 4 caracteres. É um desenho surpreendentemente elegante, que permite hierarquias complexas de dados e ainda assim é relativamente fácil de analisar depois que você entende o básico.
Estrutura do arquivo HEIC
Cabeçalho do HEIC (caixa ftyp)
| Offset | Hex | ASCII | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 000000186674797068656963 | ....ftypheic | |||||||||||
| 000C | 000000006D69663168656963 | ....mif1heic | |||||||||||
Estrutura de uma caixa
Se o tamanho for 1, vem um tamanho estendido de 8 bytes depois do tipo. Se for 0, a caixa se estende até o fim do arquivo.
Principais caixas
A hierarquia de caixas dos arquivos HEIC pode ficar bem profunda. Diferentemente do JPEG, em que os metadados ficam em posições previsíveis, o HEIC enterra os metadados vários níveis abaixo, em uma estrutura aninhada. Veja como as peças principais se encaixam.
ftyp:tipo do arquivo
Primeira caixa do arquivo. Contém a marca principal e as marcas compatíveis. Obrigatória para identificar o formato.
heic heix hevc hevx heim heis hevm hevs mif1 msf1meta:contêiner de metadados
Contém todos os metadados, incluindo a localização dos itens, as propriedades e as associações. É aqui que ficam os dados EXIF/XMP.
meta (contêiner de metadados) ├── hdlr (referência do handler) ├── pitm (ID do item principal) ├── iloc (localização dos itens → offsets dentro do mdat) │ └── entradas [item_id, offset, tamanho] ├── iinf (informações dos itens → localizar o item 'Exif') │ └── entradas infe com os tipos de item ├── iprp (propriedades dos itens) │ ├── ipco (contêiner de propriedades) │ │ ├── hvcC (configuração do decodificador HEVC) │ │ ├── ispe (dimensões da imagem) │ │ ├── colr (perfil ICC, offset+12) │ │ ├── Exif (EXIF em formato TIFF) │ │ └── pixi (informações dos pixels) │ └── ipma (associações de propriedades) └── iref (referências entre itens)
mdat:dados de mídia
Contém os dados da imagem codificados em HEVC. A caixa iloc, dentro da meta, fornece os offsets dentro do mdat.
Metadados no HEIC
Se você está acostumado com os marcadores APP do JPEG, o HEIC segue outro caminho. Em vez de marcadores sequenciais no começo do arquivo, os metadados ficam como "propriedades de item" dentro da caixa meta. Os dados EXIF continuam no conhecido formato TIFF, mas, para encontrá-los, é preciso navegar antes pela hierarquia de caixas.
Propriedade EXIF
Guardada no ipco (contêiner de propriedades de item) com o tipo "Exif". Contém os dados EXIF padrão em formato TIFF, igual ao JPEG.
Propriedade XMP
Metadados em XML guardados como propriedade do tipo "mime", com o content-type "application/rdf+xml".
Perfil ICC
Perfil de cor guardado na caixa "colr" com o tipo "prof".
Por que os offsets importam
A caixa iloc contém offsets precisos, em bytes, que apontam para dentro do mdat. Se o tamanho de qualquer caixa mudar (por exemplo, ao remover metadados), esses offsets precisam ser recalculados, ou o arquivo fica ilegível.
Anonimização sem perdas
É aqui que o HEIC complica. O formato foi projetado para guardar vídeo e imagem com eficiência, não para facilitar a manipulação de metadados.
O desafio
A estrutura do HEIC, baseada em offsets, torna arriscado remover bytes. A caixa iloc contém offsets precisos que apontam para dentro do mdat. Se você remover uma única caixa, esses offsets ficam errados e a imagem deixa de abrir.
A abordagem de sobrescrita com zeros
Em vez de remover as caixas de metadados, o PicScrub sobrescreve o conteúdo delas com zeros, preservando a estrutura e o tamanho das caixas.
Depois: [Exif][0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00...]
Por que sobrescrever com zeros?
- • Preserva a integridade do arquivo:todos os offsets continuam válidos
- • Sem recompressão:os dados da imagem não são tocados
- • Metadados destruídos:zeros não carregam nenhuma informação
- • Dá para reverter?:não, o dado sobrescrito se foi
Como o PicScrub processa o HEIC
Analisar a estrutura de caixas
Percorrer recursivamente ftyp e meta e identificar todas as caixas
Localizar os metadados
Encontrar as propriedades Exif e XMP dentro do contêiner ipco
Zerar o conteúdo dos metadados
Sobrescrever com zeros o conteúdo das caixas de metadados
Preservar a estrutura
Manter os cabeçalhos, os tamanhos das caixas e todos os offsets inalterados
Uma observação sobre o tamanho do arquivo
Como o PicScrub sobrescreve com zeros em vez de remover, o arquivo de saída fica com o mesmo tamanho da entrada. O espaço dos metadados é preservado, mas preenchido com zeros.
HEIC x HEIF x AVIF
Os nomes confundem, então vamos esclarecer. O HEIF é o formato do contêiner, enquanto HEIC e AVIF indicam qual codec foi usado para comprimir a imagem dentro desse contêiner.
| Formato | Contêiner | Codec | Usado por |
|---|---|---|---|
| HEIC | HEIF | HEVC (H.265) | Aparelhos da Apple |
| HEIF | HEIF | Vários | Contêiner genérico |
| AVIF | HEIF | AV1 | Web (livre de royalties) |
Os três usam a mesma estrutura de contêiner ISOBMFF/HEIF, então a abordagem do PicScrub funciona para todos eles.