PicScrub logoPicScrub
Voltar para os formatos

JPEG

o que mais vaza

Um 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.

perfil de cor, mantido se você quiser
SOIinício
APP0JFIF
APP1EXIF
APP1XMP
APP2ICC
APP13IPTC
COMcomentário
SOS …sua foto de verdade, intacta
EOIfim
GPS e câmera se escondem aqui, removido
idêntico byte a byte

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

SOI
APP0-15
DQT
SOF
DHT
SOS + Data
EOI
SOI
2 bytes
Início da imagem (FF D8)
APP0-15
100 bytes
Marcadores de aplicativo (metadados)
DQT
130 bytes
Tabelas de quantização
SOF
20 bytes
Início do quadro
DHT
420 bytes
Tabelas de Huffman
SOS + Data
Tamanho variável
Dados de varredura (imagem)
EOI
2 bytes
Fim da imagem (FF D9)

Exemplo de cabeçalho JPEG

SOI (início da imagem)
Marcador APP0
Tamanho do APP0
Identificador JFIF
Dados JFIF
Marcador APP1
Tamanho do APP1
Identificador Exif
OffsetHexASCII
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

MarcadorNomeDescrição
FF D8SOIInício da imagem
FF D9EOIFim da imagem
FF C0SOF0Início do quadro (DCT sequencial)
FF C2SOF2Início do quadro (DCT progressivo)
FF C4DHTDefine a tabela de Huffman
FF DBDQTDefine a tabela de quantização
FF DDDRIDefine o intervalo de reinício
FF DASOSInício da varredura (os dados da imagem vêm a seguir)
FF FECOMComentário (metadados)
FF E0APP0Marcador JFIF
FF E1APP1Marcador EXIF / XMP
FF E2APP2Perfil ICC / MPF
FF EDAPP13IPTC / Photoshop
FF EEAPP14Transformaçã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)

Ordem dos bytes (II = little-endian)
Número mágico (42)
Offset do IFD0
OffsetHexASCII
0000
49492A0008000000
II*.....

II = Intel (little-endian), MM = Motorola (big-endian)

Estrutura de uma entrada de IFD (12 bytes)

ID da tagTipoContagemValor/offset
2 bytes2 bytes4 bytes4 bytes

Principais entradas do IFD

0x010F:Make
0x0110:Model
0x0132:DateTime
0x8769:ExifIFDPointer
0x8825:GPSInfoIFDPointer
0x927C:MakerNote

Como 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.

1

Validar o cabeçalho

Conferir o marcador SOI (FF D8) no início do arquivo

2

Analisar os marcadores

Ler cada marcador em sequência, extraindo o tipo e o tamanho

3

Identificar os metadados

Verificar os identificadores nos segmentos APP (EXIF, XMP, IPTC etc.)

4

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 tagNomeRisco de privacidade
0x9003DateTimeOriginalAlto
0x9004DateTimeDigitizedAlto
0x9010OffsetTimeMédio
0x9286UserCommentAlto
0x927CMakerNoteAlto
0xA420ImageUniqueIDAlto
0xA430CameraOwnerNameAlto
0xA431BodySerialNumberAlto
0xA434LensModelMédio
0xA435LensSerialNumberAlto
0xFDE8OwnerNameAlto
0xFDE9SerialNumberAlto
Ver todas as tags de configuração da câmera (não identificam você)
0x829A ExposureTime
0x829D FNumber
0x8822 ExposureProgram
0x8827 ISOSpeedRatings
0x9201 ShutterSpeedValue
0x9202 ApertureValue
0x9203 BrightnessValue
0x9204 ExposureBiasValue
0x9207 MeteringMode
0x9208 LightSource
0x9209 Flash
0x920A FocalLength
0xA001 ColorSpace
0xA002 PixelXDimension
0xA003 PixelYDimension
0xA402 ExposureMode
0xA403 WhiteBalance
0xA405 FocalLengthIn35mmFilm
0xA406 SceneCaptureType

Referê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 tagNomeDescrição
0x0000GPSVersionIDVersão das tags GPS
0x0001GPSLatitudeRefN ou S
0x0002GPSLatitudeGraus, minutos e segundos
0x0003GPSLongitudeRefL ou O
0x0004GPSLongitudeGraus, minutos e segundos
0x0005GPSAltitudeRefAcima ou abaixo do nível do mar
0x0006GPSAltitudeMetros
0x0007GPSTimeStampHora UTC
0x001DGPSDateStampData UTC
0x0012GPSMapDatumDados do levantamento geodésico
0x001BGPSProcessingMethodGPS/CELLID/WLAN/MANUAL
0x001CGPSAreaInformationNome 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)