JPEG
el que más filtraUn archivo JPEG guarda sus metadatos en segmentos APPn, entre la cabecera del archivo y los datos de imagen. Esto es lo que vive en cada parte y qué hace PicScrub con ella.
Qué se elimina
- EXIF coordenadas GPS, marca y modelo de la cámara, fecha y hora, ajustes de exposición
- XMP historial de edición, software utilizado, valoraciones
- IPTC / Photoshop títulos, créditos, palabras clave
- Comentarios y miniaturas incrustadas una copia diminuta del original que puede sobrevivir a tus recortes y ediciones
Qué puedes conservar
- Datos de imagen siempre intactos, nunca se recodifican
- Perfil de color ICC opcional, para que los colores no cambien
- Orientación opcional, para que los retratos no se giren
- Aviso de copyright opcional, para quien quiere crédito sin coordenadas
Visión general de la estructura
Si alguna vez has abierto un JPEG en un editor hexadecimal, habrás visto que está formado por segmentos separados por marcadores. Todos los marcadores empiezan por 0xFF, seguido de un byte que indica qué tipo de segmento es. Este diseño hace que los JPEG sean relativamente fáciles de analizar: basta con buscar bytes FF y comprobar qué viene después.
Lo interesante en cuanto a privacidad es que todos los metadatos (EXIF, GPS, fecha y hora) viven en esos segmentos, completamente separados de los datos reales de la imagen. Por eso podemos eliminar los metadatos sin tocar los píxeles ni recomprimir nada.
Estructura de un archivo JPEG
Ejemplo de cabecera JPEG
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | FFD8FFE000104A464946000101000048 | ......JFIF.....H | |||||||||||||||
| 0010 | 00480000FFE112344578696600000000 | .H.....4Exif.. | |||||||||||||||
Estructura de un marcador
FF xx:Marcador (xx indica el tipo)LL LL:Longitud (2 bytes, big-endian, se incluye a sí misma)Data...:Datos del segmento (longitud - 2 bytes)
Referencia completa de marcadores JPEG
| Marcador | Nombre | Descripción |
|---|---|---|
| FF D8 | SOI | Inicio de imagen |
| FF D9 | EOI | Fin de imagen |
| FF C0 | SOF0 | Inicio de fotograma (DCT baseline) |
| FF C2 | SOF2 | Inicio de fotograma (DCT progresivo) |
| FF C4 | DHT | Definición de tabla de Huffman |
| FF DB | DQT | Definición de tabla de cuantificación |
| FF DD | DRI | Definición del intervalo de reinicio |
| FF DA | SOS | Inicio del escaneo (a continuación van los datos de la imagen) |
| FF FE | COM | Comentario (metadatos) |
| FF E0 | APP0 | Marcador JFIF |
| FF E1 | APP1 | Marcador EXIF / XMP |
| FF E2 | APP2 | Perfil ICC / MPF |
| FF ED | APP13 | IPTC / Photoshop |
| FF EE | APP14 | Transformación de color de Adobe |
Dorado = metadatos (se eliminan), sin resaltar = estructura que se conserva
JFIF frente a EXIF
Hay algo que confunde a mucha gente: los archivos JPEG suelen contener dos estándares de metadatos distintos al mismo tiempo. JFIF llegó primero y se ocupa de lo básico, como la resolución. Después, las cámaras empezaron a añadir datos EXIF con toda la información detallada de la toma. La mayoría de los JPEG modernos llevan los dos, y por eso verás marcadores APP0 y APP1 cerca del principio del archivo.
APP0:JFIF
JPEG File Interchange Format. Información básica de la imagen.
- • Número de versión
- • Densidad de píxeles (DPI)
- • Relación de aspecto
- • Miniatura opcional
APP1:EXIF
Exchangeable Image File Format. Metadatos de la cámara.
- • Marca y modelo de la cámara
- • Coordenadas GPS
- • Marcas de tiempo
- • Ajustes de exposición
Los marcadores APP en detalle
La especificación de JPEG reservó 16 marcadores de "aplicación" (de APP0 a APP15) para que cada fabricante los usara como quisiera. Con los años, distintas organizaciones se fueron apropiando de marcadores diferentes para sus formatos de metadatos. El resultado es un pequeño caos, pero al menos es un caos bien documentado.
Lo complicado es que un mismo marcador puede significar cosas distintas según su contenido. APP1, por ejemplo, puede contener datos EXIF o XMP, así que hay que mirar la cadena identificadora del interior para saber con cuál estás tratando.
APP0 (0xFFE0):JFIF
Identificador: JFIF\0. Contiene la versión, las unidades de densidad, la densidad X/Y y una miniatura incrustada opcional. Suele ser seguro conservarlo.
APP1 (0xFFE1):EXIF
Identificador: Exif\0\0. Contiene una estructura TIFF completa con entradas IFD para la información de la cámara, los datos GPS, la fecha y hora, las miniaturas y las maker notes. El principal problema de privacidad.
APP1 (0xFFE1):XMP
Identificador: http://ns.adobe.com/xap/1.0/\0. Estándar de metadatos basado en XML creado por Adobe. Puede contener el historial de edición, información del software y datos EXIF ampliados.
Espacios de nombres XMP
xmp: http://ns.adobe.com/xap/1.0/xmpMM: http://ns.adobe.com/xap/1.0/mm/dc: http://purl.org/dc/elements/1.1/photoshop: http://ns.adobe.com/photoshop/1.0/tiff: http://ns.adobe.com/tiff/1.0/exif: http://ns.adobe.com/exif/1.0/APP1 (0xFFE1):XMP extendido
Identificador: http://ns.adobe.com/xmp/extension/\0. Para datos XMP de más de 65 KB, repartidos entre varios segmentos APP1.
APP2 (0xFFE2):MPF
Identificador: MPF\0. Multi-Picture Format, para imágenes estereoscópicas y panorámicas.
APP2 (0xFFE2):Perfil ICC
Identificador: ICC_PROFILE\0. Datos de gestión del color. Puede repartirse entre varios marcadores APP2. Normalmente es seguro conservarlo.
APP13 (0xFFED):IPTC/Photoshop
Identificador: Photoshop 3.0\0. Contiene datos IPTC-IIM con pies de foto, palabras clave, copyright e información del creador. Puede incluir datos sobre el autor.
APP14 (0xFFEE):Adobe
Identificador: Adobe\0. Contiene los indicadores de transformación de color (RGB/CMYK). Es importante para que los colores se muestren correctamente.
La estructura de EXIF
Aquí es donde la cosa se pone interesante (y un poco rara). Los datos EXIF son en realidad un pequeño archivo TIFF incrustado dentro de tu JPEG. Sí, en serio. Tiene su propia cabecera, su propio orden de bytes y usa la estructura IFD (Image File Directory) de TIFF para guardar las etiquetas.
Lo primero que verás después del identificador "Exif" es una cabecera TIFF que indica si los datos son little-endian (Intel, "II") o big-endian (Motorola, "MM"). Equivocarse aquí significa que todos los números saldrán mal, así que es lo primero que comprueba cualquier analizador.
Cabecera TIFF (8 bytes)
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 49492A0008000000 | II*..... | |||||||
II = Intel (little-endian), MM = Motorola (big-endian)
Estructura de una entrada IFD (12 bytes)
Entradas IFD principales
0x010F:Make0x0110:Model0x0132:DateTime0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0x927C:MakerNoteCómo procesa PicScrub los JPEG
El enfoque es bastante directo: recorremos el archivo marcador a marcador, conservamos los que son imprescindibles para mostrar la imagen y saltamos los que contienen metadatos. Como nunca tocamos los datos comprimidos de la imagen, no hay ninguna pérdida de calidad.
La clave está en que la estructura de marcadores de JPEG lo pone fácil. No necesitamos entender los coeficientes DCT ni las tablas de Huffman. Solo tenemos que identificar qué segmentos son metadatos y cuáles no.
Validar la cabecera
Comprobar el marcador SOI (FF D8) al principio del archivo
Analizar los marcadores
Leer cada marcador en orden y extraer su tipo y su longitud
Identificar los metadatos
Comprobar los identificadores de los segmentos APP (EXIF, XMP, IPTC, etc.)
Copia selectiva
Copiar al resultado los segmentos que no son metadatos y saltar los que sí lo son
Qué se conserva
- • Marcadores SOI/EOI (obligatorios)
- • DQT (tablas de cuantificación)
- • SOF (cabecera del fotograma)
- • DHT (tablas de Huffman)
- • SOS y datos del escaneo (la imagen en sí)
- • Opcional: perfil de color ICC (configurable)
Qué se elimina
- • APP1 EXIF (cámara, GPS, fecha y hora)
- • APP1 XMP (metadatos de edición)
- • APP13 IPTC (pies de foto, autor)
- • Marcadores COM (comentarios)
- • Miniaturas EXIF
Referencia de etiquetas EXIF
No todas las etiquetas EXIF son iguales en cuanto a privacidad. Algunas, como los ajustes de exposición, son bastante inofensivas. Otras, como los números de serie o el nombre del propietario, pueden identificarte a ti o a tu equipo de forma inequívoca. Estas son las que consideramos de alto riesgo:
| ID de etiqueta | Nombre | Riesgo de privacidad |
|---|---|---|
| 0x9003 | DateTimeOriginal | Alto |
| 0x9004 | DateTimeDigitized | Alto |
| 0x9010 | OffsetTime | Medio |
| 0x9286 | UserComment | Alto |
| 0x927C | MakerNote | Alto |
| 0xA420 | ImageUniqueID | Alto |
| 0xA430 | CameraOwnerName | Alto |
| 0xA431 | BodySerialNumber | Alto |
| 0xA434 | LensModel | Medio |
| 0xA435 | LensSerialNumber | Alto |
| 0xFDE8 | OwnerName | Alto |
| 0xFDE9 | SerialNumber | Alto |
Ver todas las etiquetas de ajustes de cámara (no identificativas)
0x829A ExposureTime0x829D FNumber0x8822 ExposureProgram0x8827 ISOSpeedRatings0x9201 ShutterSpeedValue0x9202 ApertureValue0x9203 BrightnessValue0x9204 ExposureBiasValue0x9207 MeteringMode0x9208 LightSource0x9209 Flash0x920A FocalLength0xA001 ColorSpace0xA002 PixelXDimension0xA003 PixelYDimension0xA402 ExposureMode0xA403 WhiteBalance0xA405 FocalLengthIn35mmFilm0xA406 SceneCaptureTypeReferencia de etiquetas GPS
Los datos GPS viven en su propio sub-IFD, al que apunta la etiqueta 0x8825 del IFD principal. Si ese puntero existe, hay datos de ubicación en tu imagen. Los móviles actuales son especialmente insistentes con esto, y a menudo con precisión suficiente para señalar el punto exacto en el que estabas.
| ID de etiqueta | Nombre | Descripción |
|---|---|---|
| 0x0000 | GPSVersionID | Versión de las etiquetas GPS |
| 0x0001 | GPSLatitudeRef | N o S |
| 0x0002 | GPSLatitude | Grados, minutos y segundos |
| 0x0003 | GPSLongitudeRef | E o W |
| 0x0004 | GPSLongitude | Grados, minutos y segundos |
| 0x0005 | GPSAltitudeRef | Por encima o por debajo del nivel del mar |
| 0x0006 | GPSAltitude | Metros |
| 0x0007 | GPSTimeStamp | Hora UTC |
| 0x001D | GPSDateStamp | Fecha UTC |
| 0x0012 | GPSMapDatum | Datum geodésico utilizado |
| 0x001B | GPSProcessingMethod | GPS/CELLID/WLAN/MANUAL |
| 0x001C | GPSAreaInformation | Nombre del lugar |
Referencia de etiquetas IPTC
IPTC se diseñó para que las agencias de noticias pudieran incrustar pies de foto, créditos e información de copyright. Se guarda dentro de APP13 con el identificador "Photoshop 3.0" (sí, Adobe lo adoptó). Si alguna vez has añadido información de copyright o palabras clave en Lightroom o Photoshop, es ahí donde acaban.
0x0250 By-line (autor)0x0255 By-line Title (cargo del autor)0x025A City (ciudad)0x025C Sub-location (ubicación concreta)0x025F Province/State (provincia o estado)0x0265 Country Name (país)0x0274 Copyright Notice (aviso de copyright)0x0276 Contact (contacto)0x0237 Date Created (fecha de creación)0x023C Time Created (hora de creación)0x0278 Caption/Abstract (pie de foto)0x0219 Keywords (palabras clave)