Formato WebP
O formato de imagem moderno do Google
Contêiner RIFF
O Google não inventou um contêiner novo para o WebP. Optou pelo RIFF, o mesmo formato que carrega áudio WAV e vídeo AVI desde o começo dos anos 1990. Se você já analisou um arquivo WAV, já sabe como o WebP funciona no nível do contêiner.
O formato usa blocos aninhados com identificadores de 4 caracteres (os chamados códigos FourCC). É um desenho simples e robusto, que resistiu bem à passagem do tempo.
Estrutura do arquivo WebP (contêiner RIFF)
Cabeçalho do WebP
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 52494646241A00005745425056503858 | RIFF$...WEBPVP8X | |||||||||||||||
| 0010 | 0A00000010000000FF0000FF00000000 | .............. | |||||||||||||||
Estrutura de um bloco RIFF
Observação: os dados do bloco são preenchidos até um tamanho par com um byte nulo, quando necessário.
Offsets importantes
- • Início dos sub-blocos: 12 bytes (depois de RIFF + tamanho + WEBP)
- • Cabeçalho do bloco: 8 bytes (FourCC de 4 bytes + tamanho de 4 bytes)
- • Offset do campo de tamanho: +4 a partir do início do bloco (little-endian)
Blocos de imagem
O WebP é, na prática, três formatos em um: com perdas (VP8), sem perdas (VP8L) e estendido (VP8X). O tipo do bloco indica qual método de compressão foi usado.
VP8:compressão com perdas
Usa o codec de vídeo VP8 para comprimir. Relação qualidade/tamanho parecida com a do JPEG. Arquivos WebP simples contêm apenas este bloco.
VP8L:compressão sem perdas
Compressão sem perdas com predição, transformação de cor e codificação de entropia. Costuma ficar de 25% a 34% menor que o PNG.
VP8X:formato estendido
Indica a presença de recursos opcionais: animação, canal alfa, perfil ICC, EXIF ou XMP. Obrigatório sempre que algum desses recursos existe.
ALPH:canal alfa
Dados do canal alfa separados. Podem ser comprimidos com ou sem perdas, independentemente dos dados de cor.
ANIM/ANMF:animação
O ANIM contém os parâmetros globais da animação. Os blocos ANMF contêm cada quadro, com as informações de tempo.
Blocos de metadados
Diferentemente dos arquivos WebP simples, que contêm apenas dados de imagem, os arquivos WebP estendidos podem carregar metadados. A boa notícia é que esses blocos ficam bem separados dos dados da imagem, o que facilita identificá-los e removê-los.
EXIF:metadados EXIF
Contém dados EXIF no mesmo formato do JPEG (estrutura TIFF bruta). Inclui dados da câmera, coordenadas GPS, carimbos de data/hora e miniaturas. É a principal preocupação de privacidade.
XMP:metadados XMP
Metadados em XML. Podem duplicar os dados EXIF e ainda incluir histórico de edição, informações do software e campos personalizados.
ICCP:perfil de cor ICC
Perfil de cor ICC para gerenciamento de cor. O PicScrub preserva por padrão, para manter a fidelidade das cores.
Flags do VP8X
O bloco VP8X funciona como um índice, avisando ao decodificador o que esperar do arquivo. Quando removemos os blocos de metadados, precisamos também atualizar essas flags; caso contrário, o decodificador vai procurar dados que não estão mais lá.
Bits das flags
Por que as flags importam
Quando o PicScrub remove os blocos EXIF/XMP, ele também precisa atualizar as flags do VP8X para refletir essa ausência. Caso contrário, os decodificadores podem esperar dados que não existem mais.
Como o PicScrub processa o WebP
Validar o cabeçalho RIFF
Conferir a assinatura RIFF....WEBP
Analisar os blocos
Percorrer todos os blocos RIFF, lendo o FourCC e o tamanho
Remover os blocos de metadados
Pular os blocos EXIF e XMP na hora de gravar a saída
Atualizar as flags do VP8X
Zerar os bits das flags de EXIF/XMP no bloco VP8X
Recalcular o tamanho do arquivo
Atualizar o cabeçalho RIFF com o novo tamanho total do arquivo
Preservado
- • Dados de imagem VP8/VP8L
- • Canal alfa ALPH
- • Dados de animação ANIM/ANMF
- • Perfil de cor ICCP (opcional)
Removido
- • Metadados EXIF
- • Metadados XMP
WebP simples x WebP estendido
Se um arquivo WebP não tem bloco VP8X, ele é um WebP "simples": apenas o invólucro RIFF em volta de um único bloco VP8 ou VP8L. Não é possível gravar metadados em arquivos WebP simples, então, se você se preocupa com privacidade, eles são ideais.
WebP simples
Contém apenas o bloco VP8 ou VP8L. Não admite metadados.
WebP estendido
Tem bloco VP8X, o que habilita metadados, canal alfa e animação.