PicScrub logoPicScrub
Voltar para os formatos

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

ftyp
meta
mdat
ftyp
24 bytes
Tipo do arquivo e marcas
meta
1000 bytes
Contêiner de metadados
mdat
Tamanho variável
Dados de mídia (HEVC)

Cabeçalho do HEIC (caixa ftyp)

Tamanho da caixa (24)
Tipo da caixa (ftyp)
Marca principal (heic)
Versão secundária
Compatível (mif1)
Compatível (heic)
OffsetHexASCII
0000
000000186674797068656963
....ftypheic
000C
000000006D69663168656963
....mif1heic

Estrutura de uma caixa

TamanhoTipoDados
4 bytes (BE)4 bytesTamanho - 8

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.

Marcas compatíveis: heic heix hevc hevx heim heis hevm hevs mif1 msf1

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

Antes:  [Exif][Dados GPS: 37.7749, -122.4194][Câmera: iPhone]
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

1

Analisar a estrutura de caixas

Percorrer recursivamente ftyp e meta e identificar todas as caixas

2

Localizar os metadados

Encontrar as propriedades Exif e XMP dentro do contêiner ipco

3

Zerar o conteúdo dos metadados

Sobrescrever com zeros o conteúdo das caixas de metadados

4

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.

Entrada: 2,5 MB (com 50 KB de EXIF)
Saída: 2,5 MB (50 KB de 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.

FormatoContêinerCodecUsado por
HEICHEIFHEVC (H.265)Aparelhos da Apple
HEIFHEIFVáriosContêiner genérico
AVIFHEIFAV1Web (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.