PicScrub logoPicScrub
Voltar para os formatos

Formato TIFF

Tagged Image File Format

Estrutura do cabeçalho

O TIFF é o avô dos metadados de imagem. Quando você vê dados EXIF em um JPEG, o que está ali é, na verdade, uma estrutura TIFF embutida no arquivo. Entender o TIFF é entender como funciona a maior parte dos metadados de imagem.

O formato começa com um cabeçalho de 8 bytes que informa duas coisas essenciais: a ordem dos bytes (Intel ou Motorola) e onde encontrar o primeiro IFD. Daí em diante, é seguir ponteiros.

Estrutura do arquivo TIFF

Header
IFD0
Strip Data
EXIF IFD
GPS IFD
Header
8 bytes
Ordem dos bytes + número mágico + offset do IFD
IFD0
200 bytes
Diretório principal da imagem
Strip Data
Tamanho variável
Dados dos pixels da imagem
EXIF IFD
500 bytes
Subdiretório EXIF
GPS IFD
100 bytes
Subdiretório GPS

Cabeçalho TIFF

Ordem dos bytes (II = little-endian)
Número mágico (42)
Offset do primeiro IFD
OffsetHexASCII
0000
49492A0008000000
II*.....

Ordem dos bytes

49 49 (II)

Intel:little-endian (byte menos significativo primeiro)

4D 4D (MM)

Motorola:big-endian (byte mais significativo primeiro)

Estrutura do IFD

IFD significa Image File Directory, mas pense nele como um índice. É uma lista plana de tags, cada uma apontando para algum dado. O detalhe engenhoso é que um IFD pode apontar para outros IFDs, criando uma estrutura em árvore.

Layout do IFD

2 bytesContagem de entradas (número de tags)
12 × N bytesEntradas de tag (12 bytes cada)
4 bytesOffset do próximo IFD (0 se não houver)

Estrutura de uma entrada de tag (12 bytes)

ID da tagTipoContagemValor/offset
2 bytes2 bytes4 bytes4 bytes

Se o dado cabe em 4 bytes, ele é guardado direto no campo de valor. Caso contrário, o campo contém um offset até o dado.

Tipos de tag

O TIFF é fortemente tipado. Cada tag especifica não só o que contém, mas também como interpretar os bytes. É por isso que você precisa entender o sistema de tipos para analisar TIFF corretamente.

IDNomeTamanhoDescrição
1BYTE1Inteiro de 8 bits sem sinal
2ASCII1String terminada em null (8 bits)
3SHORT2Inteiro de 16 bits sem sinal
4LONG4Inteiro de 32 bits sem sinal
5RATIONAL8Dois LONGs: numerador/denominador
6SBYTE1Inteiro de 8 bits com sinal
7UNDEFINED1Bytes brutos (dados binários)
8SSHORT2Inteiro de 16 bits com sinal
9SLONG4Inteiro de 32 bits com sinal
10SRATIONAL8Dois SLONGs: num./den. com sinal
11FLOAT4Float IEEE de 32 bits
12DOUBLE8Double IEEE de 64 bits
13IFD4Ponteiro para um IFD aninhado

Regra de armazenamento do valor

Se tamanho × contagem ≤ 4 bytes, o valor é guardado direto no campo de valor de 4 bytes. Caso contrário, o campo contém um offset até onde o dado está gravado no arquivo.

Cálculo dos offsets de IFD

A parte mais difícil de analisar TIFF é seguir a cadeia de offsets. Tudo é relativo ao início do arquivo, e você vai pular de um lado para o outro o tempo todo. Veja como funciona a conta:

// Localização do IFD0
IFD0_offset = bytes[4:8] // Do cabeçalho TIFF
// Localização do próximo IFD (por exemplo, o IFD1 da miniatura)
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
// Localização do SubIFD (EXIF, GPS)
subIFD_offset = tag_value // Da tag ponteiro (0x8769, 0x8825)

Tags importantes

Tags de dados da imagem (preservadas)

0x0100:ImageWidth
0x0101:ImageLength
0x0102:BitsPerSample
0x0103:Compression
0x0111:StripOffsets
0x0117:StripByteCounts

Tags de metadados (removidas)

0x010F:Make (fabricante da câmera)
0x0110:Model (modelo da câmera)
0x0132:DateTime
0x013B:Artist
0x8298:Copyright
0x9003:DateTimeOriginal

Tags ponteiro (sub-IFDs)

0x8769:ExifIFDPointer
0x8825:GPSInfoIFDPointer
0xA005:InteroperabilityIFDPointer

SubIFDs

O IFD principal (IFD0) costuma conter "tags ponteiro" que referenciam subdiretórios. É assim que o EXIF, o GPS e outros metadados ficam organizados em grupos lógicos, mantendo o IFD principal enxuto.

SubIFD do EXIF

Contém os metadados específicos da câmera: exposição, abertura, ISO, distância focal, flash, balanço de branco e mais.

SubIFD do GPS

Contém os dados de geolocalização: latitude, longitude, altitude, horário, satélites, velocidade e direção. Grande preocupação de privacidade.

Maker Notes

Dados proprietários da câmera. O formato varia de fabricante para fabricante. Podem conter números de série, versão do firmware e configurações personalizadas.

Como o PicScrub processa o TIFF

1

Analisar o cabeçalho

Determinar a ordem dos bytes (II/MM) e localizar o primeiro IFD

2

Montar a lista de tags permitidas

Identificar as tags essenciais para renderizar a imagem

3

Filtrar as entradas do IFD

Remover as tags de metadados e zerar os ponteiros de SubIFD

4

Regravar o arquivo

Remontar o TIFF com IFDs limpos e os dados da imagem copiados

Recálculo dos offsets

Os arquivos TIFF usam offsets o tempo todo. Quando os metadados são removidos, o PicScrub precisa recalcular todos os offsets para manter a integridade do arquivo.