PicScrub logoPicScrub
Voltar para os formatos

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

Signature
IHDR
Metadata
IDAT
IEND
Signature
8 bytes
89 50 4E 47 0D 0A 1A 0A
IHDR
25 bytes
Cabeçalho da imagem (obrigatório)
Metadata
100 bytes
Blocos tEXt, iTXt e eXIf
IDAT
Tamanho variável
Dados comprimidos da imagem
IEND
12 bytes
Marcador de fim da imagem

Assinatura do PNG e IHDR

Assinatura PNG
Tamanho do IHDR (13)
Tipo IHDR
Largura (256)
Altura (256)
Profundidade de bits, tipo de cor etc.
OffsetHexASCII
0000
89504E470D0A1A0A0000000D49484452
.PNG........IHDR
0010
00000100000001000802000000000000
.............

Estrutura de um bloco

TamanhoTipoDadosCRC32
4 bytes4 bytesVariável4 bytes

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.

Formato: palavra-chave + null + texto

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.

Palavra-chave do XMP: XML:com.adobe.xmp\0

eXIf: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

1

Conferir a assinatura

Verificar a assinatura do PNG: 89 50 4E 47 0D 0A 1A 0A

2

Analisar os blocos

Ler o tamanho e o tipo de cada bloco e validar o CRC

3

Filtrar os blocos de metadados

Identificar e pular os blocos tEXt, zTXt, iTXt, eXIf e tIME

4

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)