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
Cabecera TIFF
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 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
Estructura de una entrada de etiqueta (12 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.
| ID | Nombre | Tamaño | Descripción |
|---|---|---|---|
| 1 | BYTE | 1 | Entero de 8 bits sin signo |
| 2 | ASCII | 1 | Cadena terminada en nulo (8 bits) |
| 3 | SHORT | 2 | Entero de 16 bits sin signo |
| 4 | LONG | 4 | Entero de 32 bits sin signo |
| 5 | RATIONAL | 8 | Dos LONG: numerador/denominador |
| 6 | SBYTE | 1 | Entero de 8 bits con signo |
| 7 | UNDEFINED | 1 | Bytes en bruto (datos binarios) |
| 8 | SSHORT | 2 | Entero de 16 bits con signo |
| 9 | SLONG | 4 | Entero de 32 bits con signo |
| 10 | SRATIONAL | 8 | Dos SLONG: numerador/denominador con signo |
| 11 | FLOAT | 4 | Coma flotante IEEE de 32 bits |
| 12 | DOUBLE | 8 | Coma flotante IEEE de 64 bits |
| 13 | IFD | 4 | Puntero 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:
IFD0_offset = bytes[4:8] // De la cabecera TIFF
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
subIFD_offset = tag_value // De la etiqueta puntero (0x8769, 0x8825)
Etiquetas importantes
Etiquetas de datos de imagen (se conservan)
0x0100:ImageWidth0x0101:ImageLength0x0102:BitsPerSample0x0103:Compression0x0111:StripOffsets0x0117:StripByteCountsEtiquetas de metadatos (se eliminan)
0x010F:Make (fabricante de la cámara)0x0110:Model (modelo de la cámara)0x0132:DateTime0x013B:Artist0x8298:Copyright0x9003:DateTimeOriginalEtiquetas puntero (sub-IFD)
0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0xA005:InteroperabilityIFDPointerLos 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
Analizar la cabecera
Determinar el orden de bytes (II/MM) y localizar el primer IFD
Crear la lista blanca de etiquetas
Identificar las etiquetas imprescindibles para mostrar la imagen
Filtrar las entradas del IFD
Eliminar las etiquetas de metadatos y poner a cero los punteros a los SubIFD
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.