JPEG
o que mais vazaUm arquivo JPEG guarda seus metadados em segmentos APPn, entre o cabeçalho do arquivo e os dados da imagem. Veja o que mora em cada parte e o que o PicScrub faz com ela.
O que é removido
- EXIF coordenadas GPS, marca e modelo da câmera, data e hora, ajustes de exposição
- XMP histórico de edição, software usado, avaliações
- IPTC / Photoshop legendas, créditos, palavras-chave
- Comentários e miniaturas embutidas uma cópia minúscula do original que pode sobreviver aos seus cortes
O que você pode manter
- Dados da imagem sempre intactos, nunca recodificados
- Perfil de cor ICC opcional, para as cores não mudarem
- Orientação opcional, para retratos não virarem
- Aviso de copyright opcional, para quem quer crédito sem coordenadas
Visão geral da estrutura do arquivo
Se você já abriu um JPEG em um editor hexadecimal, deve ter notado que ele é formado por segmentos separados por marcadores. Todo marcador começa com 0xFF, seguido de um byte que indica o tipo de segmento. Esse desenho torna o JPEG relativamente fácil de analisar: basta procurar os bytes FF e verificar o que vem depois.
O ponto interessante para a privacidade é que todos os metadados (EXIF, GPS, data e hora) ficam nesses segmentos, completamente separados dos dados da imagem. É por isso que conseguimos remover os metadados sem tocar nos pixels nem recomprimir nada.
Estrutura do arquivo JPEG
Exemplo de cabeçalho JPEG
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | FFD8FFE000104A464946000101000048 | ......JFIF.....H | |||||||||||||||
| 0010 | 00480000FFE112344578696600000000 | .H.....4Exif.. | |||||||||||||||
Estrutura de um marcador
FF xx:marcador (xx identifica o tipo)LL LL:tamanho (2 bytes, big-endian, incluindo ele mesmo)Data...:dados do segmento (tamanho - 2 bytes)
Referência completa dos marcadores JPEG
| Marcador | Nome | Descrição |
|---|---|---|
| FF D8 | SOI | Início da imagem |
| FF D9 | EOI | Fim da imagem |
| FF C0 | SOF0 | Início do quadro (DCT sequencial) |
| FF C2 | SOF2 | Início do quadro (DCT progressivo) |
| FF C4 | DHT | Define a tabela de Huffman |
| FF DB | DQT | Define a tabela de quantização |
| FF DD | DRI | Define o intervalo de reinício |
| FF DA | SOS | Início da varredura (os dados da imagem vêm a seguir) |
| FF FE | COM | Comentário (metadados) |
| 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 | Transformação de cor da Adobe |
Dourado = metadados (removidos), sem destaque = estrutura que permanece
JFIF x EXIF
Tem uma coisa que confunde muita gente: os arquivos JPEG costumam conter dois padrões de metadados diferentes ao mesmo tempo. O JFIF veio primeiro e cuida do básico, como a resolução. Depois, as câmeras começaram a gravar dados EXIF com todas as informações detalhadas da captura. A maioria dos JPEGs modernos tem os dois, e é por isso que você vê os marcadores APP0 e APP1 logo no começo do arquivo.
APP0:JFIF
JPEG File Interchange Format. Informações básicas da imagem.
- • Número da versão
- • Densidade de pixels (DPI)
- • Proporção da imagem
- • Miniatura opcional
APP1:EXIF
Exchangeable Image File Format. Metadados da câmera.
- • Marca e modelo da câmera
- • Coordenadas GPS
- • Carimbos de data/hora
- • Configurações de exposição
Os marcadores APP a fundo
A especificação do JPEG reservou 16 marcadores de "aplicativo" (de APP0 a APP15) para que cada fabricante usasse como quisesse. Ao longo dos anos, diferentes organizações se apropriaram de marcadores distintos para os seus formatos de metadados. O resultado é uma bagunça, mas pelo menos é uma bagunça bem documentada.
O complicado é que o mesmo marcador pode significar coisas diferentes dependendo do conteúdo. O APP1, por exemplo, pode conter dados EXIF ou XMP, então é preciso olhar a string de identificação lá dentro para saber com qual dos dois você está lidando.
APP0 (0xFFE0):JFIF
Identificador: JFIF\0. Contém a versão, as unidades de densidade, a densidade X/Y e uma miniatura embutida opcional. Em geral, é seguro preservar.
APP1 (0xFFE1):EXIF
Identificador: Exif\0\0. Contém uma estrutura TIFF completa, com entradas de IFD para dados da câmera, GPS, data e hora, miniaturas e maker notes. É a principal preocupação de privacidade.
APP1 (0xFFE1):XMP
Identificador: http://ns.adobe.com/xap/1.0/\0. Padrão de metadados em XML criado pela Adobe. Pode conter histórico de edição, informações do software e dados EXIF estendidos.
Namespaces do 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 estendido
Identificador: http://ns.adobe.com/xmp/extension/\0. Para dados XMP acima de 65 KB, divididos em vários segmentos APP1.
APP2 (0xFFE2):MPF
Identificador: MPF\0. Multi-Picture Format, usado em imagens estereoscópicas e panoramas.
APP2 (0xFFE2):perfil ICC
Identificador: ICC_PROFILE\0. Dados de gerenciamento de cor. Podem ser divididos em vários marcadores APP2. Costuma ser seguro preservar.
APP13 (0xFFED):IPTC/Photoshop
Identificador: Photoshop 3.0\0. Contém dados IPTC-IIM com legendas, palavras-chave, direitos autorais e dados do criador. Pode conter informações sobre o autor.
APP14 (0xFFEE):Adobe
Identificador: Adobe\0. Contém as flags de transformação de cor (RGB/CMYK). Importante para renderizar as cores corretamente.
Estrutura do EXIF
É aqui que a coisa fica interessante (e um pouco estranha). Os dados EXIF são, na prática, um arquivo TIFF em miniatura embutido dentro do seu JPEG. Sim, é isso mesmo. Ele tem cabeçalho próprio, ordem de bytes própria e usa a estrutura de IFD (Image File Directory) do TIFF para guardar as tags.
A primeira coisa que aparece depois do identificador "Exif" é um cabeçalho TIFF, que indica se os dados são little-endian (Intel, "II") ou big-endian (Motorola, "MM"). Errar isso significa que todos os números virarão lixo, então é a primeira coisa que qualquer parser verifica.
Cabeçalho TIFF (8 bytes)
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 49492A0008000000 | II*..... | |||||||
II = Intel (little-endian), MM = Motorola (big-endian)
Estrutura de uma entrada de IFD (12 bytes)
Principais entradas do IFD
0x010F:Make0x0110:Model0x0132:DateTime0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0x927C:MakerNoteComo o PicScrub processa o JPEG
A abordagem é bem direta: percorremos o arquivo marcador por marcador, mantemos os que são essenciais para exibir a imagem e pulamos os que contêm metadados. Como nunca tocamos nos dados comprimidos da imagem, não há nenhuma perda de qualidade.
A sacada é que a estrutura baseada em marcadores do JPEG facilita muito esse trabalho. Não precisamos entender de coeficientes DCT nem de tabelas de Huffman. Basta identificar quais segmentos são metadados e quais não são.
Validar o cabeçalho
Conferir o marcador SOI (FF D8) no início do arquivo
Analisar os marcadores
Ler cada marcador em sequência, extraindo o tipo e o tamanho
Identificar os metadados
Verificar os identificadores nos segmentos APP (EXIF, XMP, IPTC etc.)
Copiar seletivamente
Copiar para a saída os segmentos que não são metadados e pular os que são
O que é preservado
- • Marcadores SOI/EOI (obrigatórios)
- • DQT (tabelas de quantização)
- • SOF (cabeçalho do quadro)
- • DHT (tabelas de Huffman)
- • SOS e dados de varredura (a imagem em si)
- • Opcional: perfil de cor ICC (configurável)
O que é removido
- • APP1 EXIF (câmera, GPS, data e hora)
- • APP1 XMP (metadados de edição)
- • APP13 IPTC (legendas, autor)
- • Marcadores COM (comentários)
- • Miniaturas do EXIF
Referência de tags EXIF
Nem toda tag EXIF tem o mesmo peso quando o assunto é privacidade. Algumas, como as configurações de exposição, são bem inofensivas. Outras, como números de série e nomes de proprietário, identificam você ou o seu equipamento de forma única. Estas são as que consideramos de alto risco:
| ID da tag | Nome | Risco de privacidade |
|---|---|---|
| 0x9003 | DateTimeOriginal | Alto |
| 0x9004 | DateTimeDigitized | Alto |
| 0x9010 | OffsetTime | Médio |
| 0x9286 | UserComment | Alto |
| 0x927C | MakerNote | Alto |
| 0xA420 | ImageUniqueID | Alto |
| 0xA430 | CameraOwnerName | Alto |
| 0xA431 | BodySerialNumber | Alto |
| 0xA434 | LensModel | Médio |
| 0xA435 | LensSerialNumber | Alto |
| 0xFDE8 | OwnerName | Alto |
| 0xFDE9 | SerialNumber | Alto |
Ver todas as tags de configuração da câmera (não identificam você)
0x829A ExposureTime0x829D FNumber0x8822 ExposureProgram0x8827 ISOSpeedRatings0x9201 ShutterSpeedValue0x9202 ApertureValue0x9203 BrightnessValue0x9204 ExposureBiasValue0x9207 MeteringMode0x9208 LightSource0x9209 Flash0x920A FocalLength0xA001 ColorSpace0xA002 PixelXDimension0xA003 PixelYDimension0xA402 ExposureMode0xA403 WhiteBalance0xA405 FocalLengthIn35mmFilm0xA406 SceneCaptureTypeReferência de tags GPS
Os dados de GPS ficam em um sub-IFD próprio, apontado pela tag 0x8825 do IFD principal. Se esse ponteiro existe, há dados de localização na sua imagem. Os smartphones modernos são especialmente insistentes em gravar essas informações, muitas vezes com precisão suficiente para apontar exatamente onde você estava.
| ID da tag | Nome | Descrição |
|---|---|---|
| 0x0000 | GPSVersionID | Versão das tags GPS |
| 0x0001 | GPSLatitudeRef | N ou S |
| 0x0002 | GPSLatitude | Graus, minutos e segundos |
| 0x0003 | GPSLongitudeRef | L ou O |
| 0x0004 | GPSLongitude | Graus, minutos e segundos |
| 0x0005 | GPSAltitudeRef | Acima ou abaixo do nível do mar |
| 0x0006 | GPSAltitude | Metros |
| 0x0007 | GPSTimeStamp | Hora UTC |
| 0x001D | GPSDateStamp | Data UTC |
| 0x0012 | GPSMapDatum | Dados do levantamento geodésico |
| 0x001B | GPSProcessingMethod | GPS/CELLID/WLAN/MANUAL |
| 0x001C | GPSAreaInformation | Nome do local |
Referência de tags IPTC
O IPTC foi criado para que agências de notícias embutissem legendas, créditos e informações de direitos autorais. Ele fica dentro do APP13, com o identificador "Photoshop 3.0" (sim, a Adobe adotou o padrão). Se você já adicionou informações de copyright ou palavras-chave no Lightroom ou no Photoshop, é aqui que elas vão parar.
0x0250 By-line (autor)0x0255 By-line Title (cargo do autor)0x025A City (cidade)0x025C Sub-location (localidade)0x025F Province/State (estado)0x0265 Country Name (país)0x0274 Copyright Notice (direitos autorais)0x0276 Contact (contato)0x0237 Date Created (data de criação)0x023C Time Created (hora de criação)0x0278 Caption/Abstract (legenda)0x0219 Keywords (palavras-chave)