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
Cabeçalho TIFF
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 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
Estrutura de uma entrada de tag (12 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.
| ID | Nome | Tamanho | Descrição |
|---|---|---|---|
| 1 | BYTE | 1 | Inteiro de 8 bits sem sinal |
| 2 | ASCII | 1 | String terminada em null (8 bits) |
| 3 | SHORT | 2 | Inteiro de 16 bits sem sinal |
| 4 | LONG | 4 | Inteiro de 32 bits sem sinal |
| 5 | RATIONAL | 8 | Dois LONGs: numerador/denominador |
| 6 | SBYTE | 1 | Inteiro de 8 bits com sinal |
| 7 | UNDEFINED | 1 | Bytes brutos (dados binários) |
| 8 | SSHORT | 2 | Inteiro de 16 bits com sinal |
| 9 | SLONG | 4 | Inteiro de 32 bits com sinal |
| 10 | SRATIONAL | 8 | Dois SLONGs: num./den. com sinal |
| 11 | FLOAT | 4 | Float IEEE de 32 bits |
| 12 | DOUBLE | 8 | Double IEEE de 64 bits |
| 13 | IFD | 4 | Ponteiro 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:
IFD0_offset = bytes[4:8] // Do cabeçalho TIFF
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
subIFD_offset = tag_value // Da tag ponteiro (0x8769, 0x8825)
Tags importantes
Tags de dados da imagem (preservadas)
0x0100:ImageWidth0x0101:ImageLength0x0102:BitsPerSample0x0103:Compression0x0111:StripOffsets0x0117:StripByteCountsTags de metadados (removidas)
0x010F:Make (fabricante da câmera)0x0110:Model (modelo da câmera)0x0132:DateTime0x013B:Artist0x8298:Copyright0x9003:DateTimeOriginalTags ponteiro (sub-IFDs)
0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0xA005:InteroperabilityIFDPointerSubIFDs
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
Analisar o cabeçalho
Determinar a ordem dos bytes (II/MM) e localizar o primeiro IFD
Montar a lista de tags permitidas
Identificar as tags essenciais para renderizar a imagem
Filtrar as entradas do IFD
Remover as tags de metadados e zerar os ponteiros de SubIFD
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.