PicScrub logoPicScrub
Volver a los formatos

Formato TIFF

Tagged Image File Format

Estructura de la cabecera

TIFF es el abuelo de los metadatos de imagen. Cuando ves datos EXIF en un JPEG, lo que estás viendo en realidad es una estructura TIFF incrustada dentro del archivo. Entender TIFF es entender cómo funcionan casi todos los metadatos de imagen.

El formato empieza con una cabecera de 8 bytes que indica dos cosas fundamentales: el orden de bytes (Intel o Motorola) y dónde encontrar el primer IFD. A partir de ahí, todo consiste en seguir punteros.

Estructura de un archivo TIFF

Header
IFD0
Strip Data
EXIF IFD
GPS IFD
Header
8 bytes
Orden de bytes + número mágico + offset del IFD
IFD0
200 bytes
Directorio de la imagen principal
Strip Data
Longitud variable
Datos de los píxeles de la imagen
EXIF IFD
500 bytes
Subdirectorio EXIF
GPS IFD
100 bytes
Subdirectorio GPS

Cabecera TIFF

Orden de bytes (II = little-endian)
Número mágico (42)
Offset del primer IFD
OffsetHexASCII
0000
49492A0008000000
II*.....

Orden de bytes

49 49 (II)

Intel:little-endian (primero el byte menos significativo)

4D 4D (MM)

Motorola:big-endian (primero el byte más significativo)

Estructura de un IFD

IFD son las siglas de Image File Directory, pero puedes verlo como un índice. Es una lista plana de etiquetas, cada una apuntando a algún dato. Lo ingenioso es que un IFD puede apuntar a otros IFD, y así se forma una estructura en árbol.

Disposición de un IFD

2 bytesNúmero de entradas (cuántas etiquetas hay)
12 × N bytesEntradas de etiqueta (12 bytes cada una)
4 bytesOffset del siguiente IFD (0 si no hay)

Estructura de una entrada de etiqueta (12 bytes)

ID de etiquetaTipoRecuentoValor/offset
2 bytes2 bytes4 bytes4 bytes

Si el dato cabe en 4 bytes, se guarda directamente en el campo de valor. Si no, ese campo contiene un offset que apunta al dato.

Tipos de etiqueta

TIFF tiene un tipado estricto. Cada etiqueta indica no solo qué contiene, sino también cómo hay que interpretar sus bytes. Por eso, para analizar un TIFF correctamente, hay que entender su sistema de tipos.

IDNombreTamañoDescripción
1BYTE1Entero de 8 bits sin signo
2ASCII1Cadena terminada en nulo (8 bits)
3SHORT2Entero de 16 bits sin signo
4LONG4Entero de 32 bits sin signo
5RATIONAL8Dos LONG: numerador/denominador
6SBYTE1Entero de 8 bits con signo
7UNDEFINED1Bytes en bruto (datos binarios)
8SSHORT2Entero de 16 bits con signo
9SLONG4Entero de 32 bits con signo
10SRATIONAL8Dos SLONG: numerador/denominador con signo
11FLOAT4Coma flotante IEEE de 32 bits
12DOUBLE8Coma flotante IEEE de 64 bits
13IFD4Puntero a un IFD anidado

Regla de almacenamiento del valor

Si tamaño × recuento ≤ 4 bytes, el valor se guarda directamente en el campo de valor de 4 bytes. Si no, ese campo contiene un offset que apunta al lugar del archivo donde están los datos.

Cálculo de los offsets de los IFD

Lo más difícil de analizar un TIFF es seguir la cadena de offsets. Todo es relativo al principio del archivo, y vas a saltar de un sitio a otro constantemente. Así salen las cuentas:

// Ubicación de IFD0
IFD0_offset = bytes[4:8] // De la cabecera TIFF
// Ubicación del siguiente IFD (por ejemplo, IFD1 para la miniatura)
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
// Ubicación de un subIFD (EXIF, GPS)
subIFD_offset = tag_value // De la etiqueta puntero (0x8769, 0x8825)

Etiquetas importantes

Etiquetas de datos de imagen (se conservan)

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

Etiquetas de metadatos (se eliminan)

0x010F:Make (fabricante de la cámara)
0x0110:Model (modelo de la cámara)
0x0132:DateTime
0x013B:Artist
0x8298:Copyright
0x9003:DateTimeOriginal

Etiquetas puntero (sub-IFD)

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

Los SubIFD

El IFD principal (IFD0) suele contener "etiquetas puntero" que referencian subdirectorios. Así es como EXIF, GPS y otros metadatos se organizan en grupos lógicos sin ensuciar el IFD principal.

SubIFD de EXIF

Contiene los metadatos propios de la cámara: exposición, apertura, ISO, distancia focal, flash, balance de blancos y mucho más.

SubIFD de GPS

Contiene los datos de geolocalización: latitud, longitud, altitud, marca de tiempo, satélites, velocidad y rumbo. Un problema serio de privacidad.

Maker Notes

Datos propietarios de la cámara. El formato cambia según el fabricante. Pueden incluir números de serie, la versión del firmware y ajustes personalizados.

Cómo procesa PicScrub los TIFF

1

Analizar la cabecera

Determinar el orden de bytes (II/MM) y localizar el primer IFD

2

Crear la lista blanca de etiquetas

Identificar las etiquetas imprescindibles para mostrar la imagen

3

Filtrar las entradas del IFD

Eliminar las etiquetas de metadatos y poner a cero los punteros a los SubIFD

4

Reescribir el archivo

Reconstruir el TIFF con los IFD limpios y los datos de imagen copiados

Recálculo de los offsets

Los archivos TIFF usan offsets de archivo por todas partes. Cuando se eliminan metadatos, PicScrub tiene que recalcularlos todos para mantener la integridad del archivo.