Formato PNG
Portable Network Graphics
Estrutura em blocos
O PNG tem um dos formatos de arquivo mais limpos que existem. Tudo é organizado em "chunks", blocos autocontidos com tipo, dados e checksum. O elegante é que os decodificadores podem pular os blocos que não conhecem, e é assim que o PNG dá suporte a metadados sem quebrar programas antigos.
A parte engenhosa está no nome dos blocos: se a primeira letra é maiúscula, o bloco é "crítico" (a imagem não aparece sem ele). Minúscula significa "auxiliar", ou seja, é bom ter, mas não é essencial. Todos os blocos de metadados que nos interessam são auxiliares, e por isso podemos removê-los com segurança.
Estrutura do arquivo PNG
Assinatura do PNG e IHDR
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 89504E470D0A1A0A0000000D49484452 | .PNG........IHDR | |||||||||||||||
| 0010 | 00000100000001000802000000000000 | ............. | |||||||||||||||
Estrutura de um bloco
Convenção de nomes dos blocos
- • Primeira letra maiúscula = bloco crítico (precisa ser interpretado)
- • Primeira letra minúscula = bloco auxiliar (opcional, pode ser ignorado)
- • Segunda letra = público (maiúscula) ou privado (minúscula)
Blocos críticos
Estes blocos precisam estar presentes e ser interpretados para que a imagem seja válida. O PicScrub sempre preserva os blocos críticos.
IHDR:cabeçalho da imagem
Primeiro bloco depois da assinatura. Contém largura, altura, profundidade de bits, tipo de cor, método de compressão, método de filtragem e método de entrelaçamento. Exatamente 13 bytes de dados.
IDAT:dados da imagem
Contém os dados da imagem comprimidos (zlib/deflate). Podem estar divididos em vários blocos IDAT. Todos os blocos IDAT precisam ser consecutivos.
IEND:fim da imagem
Marca o fim do fluxo de dados do PNG. Precisa ser o último bloco. Não tem nenhum byte de dados.
PLTE:paleta
Obrigatório em imagens de cor indexada (tipo de cor 3). Contém de 1 a 256 entradas RGB de paleta.
Blocos de metadados
Blocos auxiliares que podem conter metadados sensíveis à privacidade. São estes os blocos que o PicScrub remove.
tEXt:texto sem compressão
Pares de chave e valor em codificação Latin-1. Chaves comuns: Author, Description, Copyright, Creation Time e Software.
zTXt:texto comprimido
Igual ao tEXt, mas com compressão zlib. Usado para conteúdos de texto mais longos.
iTXt:texto internacional
Texto em UTF-8 com compressão opcional. Aceita marcadores de idioma e palavras-chave traduzidas. Usado para metadados XMP.
XML:com.adobe.xmp\0eXIf:dados EXIF
Registrado como extensão do PNG em 2017. Contém dados EXIF brutos em formato TIFF, com a mesma estrutura do EXIF em JPEG. Pode conter GPS, data e hora, além de dados do dispositivo.
iCCP:perfil de cor ICC
Perfil de cor ICC embutido, comprimido com zlib. O PicScrub preserva por padrão, para manter a fidelidade das cores.
tIME:data da última modificação
Sete bytes: ano (2), mês, dia, hora, minuto e segundo. Revela quando a imagem foi modificada pela última vez.
Blocos relacionados a cor
Estes blocos afetam a renderização das cores, mas normalmente não contêm informações pessoais. O PicScrub os preserva por padrão.
sRGB
Indica o espaço de cor sRGB. Um único byte para a intenção de renderização.
gAMA
Valor de gama como inteiro sem sinal de 4 bytes (multiplicado por 100.000).
cHRM
Cromaticidades primárias e coordenadas do ponto branco.
sBIT
Profundidade de bits original das amostras de cada canal.
Verificação de CRC32
Todo bloco PNG inclui um checksum CRC32 calculado sobre o tipo e os dados do bloco. É isso que garante a integridade dos dados.
Cálculo do CRC
entrada do CRC32 = chunk_type (4 bytes) + chunk_data (N bytes) saída do CRC32 = 4 bytes acrescentados após os dados do bloco // O PNG usa o polinômio CRC-32: 0xEDB88320
Por que o PicScrub valida o CRC
Ao ler arquivos PNG, o PicScrub valida o CRC de cada bloco para garantir a integridade dos dados. Blocos corrompidos são tratados sem quebrar o processamento.
Como o PicScrub processa o PNG
Conferir a assinatura
Verificar a assinatura do PNG: 89 50 4E 47 0D 0A 1A 0A
Analisar os blocos
Ler o tamanho e o tipo de cada bloco e validar o CRC
Filtrar os blocos de metadados
Identificar e pular os blocos tEXt, zTXt, iTXt, eXIf e tIME
Remontar o arquivo
Gravar assinatura + blocos filtrados + IEND
Blocos preservados
- • IHDR, PLTE, IDAT, IEND (críticos)
- • sRGB, gAMA, cHRM (cor)
- • iCCP (perfil de cor, opcional)
- • pHYs (dimensões dos pixels)
- • tRNS (transparência)
Blocos removidos
- • tEXt (metadados de texto)
- • zTXt (texto comprimido)
- • iTXt (texto internacional, XMP)
- • eXIf (dados EXIF)
- • tIME (data de modificação)