PNG, Portable Network Graphics, trata-se de um tipo de arquivo de imagem que usa de compactação sem perdas. Criado inicialmente com o objetivo de substituir o formato Graphics Interchange Format (GIF), pelo fato de que este possuia um algoritmo de compreensão patenteado, no entanto, o PNG não suporta animações (Este também não possuí limitações de direitos autorais). Ao longo dos anos, evoluiu e tornou-se um das extensões de imagens mais utilizadas hoje em dia.
PNG contém chunks (blocos/pedaços) de estruturas críticos e auxiliares, onde estes são os que compõe os dados de um arquivo PNG, juntamente com o header e trailer. Todos os chunks possuem o seguinte layout:
Nome | Tamanho | Descrição |
---|---|---|
Tamanho | 4 bytes | Comprimento que indicam o tamanho do bloco. Definem n bytes de conteúdo. |
Tipo/Nome | 4 bytes | Indicam o nome do bloco. |
Data | n bytes | Conteúdo do bloco (com n bytes definidos pelo tamanho). |
CRC | 4 bytes | Verificação cíclica de redundância (utiliza dos bytes predecessores - desconsiderando os bytes de conteúdo - para efetuar esse cálculo). |
Convenção no nome dos chunks, suponhamos que tenhamos um bloco chamado de tBAs, vamos fazer a análise em cima desse exemplo.
t -> Esta posição representa o Ancillary bit, indica se trata-se de um chunk crítico ou auxiliar, caso seja crítico deve vir com a letra maiúscula. Ancillary bit: 0 (maiúscula) = crítico ou 1 (minúsculo) = auxiliar.
B -> Esta posição representa o private bit, indica se o bloco está registrado na lista de oficial de tipos de chunks de PNG ou se é privado, que se resume em uso pessoal.Private bit: 0 (maiúsculo) = pública ou 1 (minúsculo) = privado.
A -> Esta posição representa o Reserved bit, reservado para possíveis extensões do PNG futuras. Atualmente no padrão internacional a terceira letra deve vir maiúscula.Reserved bit: 0 (maiúsculo) = padrão internacional ou 1 (minúsculo) = não suportado.
s -> Esta posição representa o Safe-to-copy bit, define o manuseio adequado de pedaços não reconhecidos em um fluxo de dados. Safe-to-copy bit: 0 (maiúsculo) = não seguro para cópia ou 1 (minúsculo) = seguro para cópia
-
Header: Primeiros 8 bytes [89, 50, 4e, 47, 0d, 0a, 1a, 0a] (Em hexadecimal) de um arquivo PNG. Em um arquivo PNG é obrigatório a presença deles, sendo considerado uma estrutura crítica, caso contrário, a imagem será dada como corrompida e não poderá ser visualizada.
-
Chunks críticos
-
IHDR (Abreviação de image header): Como todo campo crítico, tem grande importância na composição da imagem. Este em particular, possuí dados relevantes em seu conteúdo, estes que são detalhados a seguir:
Nome Tamanho Descrição Largura (Width) 4 bytes Referente à dimensão da imagem Comprimento (Height) 4 bytes Referente à dimensão da imagem Profundidade de bit (Bit depth) 1 byte Fornece número de bits por amostra/índice de paleta Tipo de cor (Color type) 1 byte Descreve a interpretação dos dados da imagem. Método de compreensão (Compression method) 1 byte Indica o método usado para comprimir os dados da imagem Método do filtro (Filter method) 1 byte Indica o método de pré-processamento aplicado aos dados da imagem antes da compressão Método de entrelaçamento (Interlace method) 1 byte Indica a ordem de transmissão dos dados da imagem. - Tipos de cor são resultados da soma dos seguintes valores: 1 (indica que foi utilizado paleta), 2 (indica que foi usado coloração), and 4 (indica que o canal alfa foi utilizado). Valores finais válidos: 0, 2, 3, 4, e 6.
- Para largura e comprimento, zero é um valor inválido, sendo assim, caso estes possuam tal valor a imagem não poderá ser visualizada (Será tida como corrompida).
- Em matéria de curiosidade, até o momento, só temos definido um tipo de método de compreensão, este que recebe o valor de 0.
-
IDAT (Abreviação de image data): Podem haver múltiplos blocos IDAT, porém é necessário conter no mínimo um. Esse chunk é o que contém o conteúdo de composição da imagem, em resumo, o bloco que possuí os bytes da imagem em si.
-
PLTE (Abreviação de Palette): Seu nome decorre de ser o bloco que trata de paletas de cor. Este chunk é um caso especial, já que o mesmo pode não ser obrigatório dependendo do que já foi especificado até então.
- Precisa estar presente caso tenha sido específicado o tipo de cor 3 (Obrigatório aparecer).
- Pode aparecer se o tipo de cor específicado for 2 ou 6 (Não obrigatório aparecer).
- Não pode aparecer caso o tipo de cor seja 0 ou 4 (Obrigatório não aparecer).
Cor Tamanho Descrição R (Red/Vermelho) 1 byte Onde 0 = Black (Preto) e 255 = Red (Vermelho) G (Green/Verde) 1 byte Onde 0 = Black (Preto) e 255 = Green (Verde) B (Blue/Azul) 1 byte Onde 0 = Black (Preto) e 255 = Blue (Azul) -
IEND: Campo que deve aparecer no final da imagem, possuí tamanho e conteúdo zerados, já que sua funcionalidade é apenas representar o final da imagem.
-
-
Chunks auxiliares (Algumas especificações foram resumidas para simplificação do conteúdo, caso tenha curiosidade ou interesse referências serão deixadas no final do documento para que possam ser consultadas):
-
cHRM (Proveniente de Primary chromaticities and white point): Especificar as cromáticas CIE x,y,z de 1931 das primárias vermelha, verde e azul usadas na imagem, e o ponto branco referenciado.
-
gAMA (Proveniente de Image gamma): Especifica a relação entre as amostras de imagem e a intensidade de saída do display desejada.
-
iCCP (Proveniente de Embedded ICC profile): Estando presente significa que as amostras de imagem estão de acordo com o espaço de cor representado pelo perfil ICC incorporado, conforme definido pelo International Color Consortium. O espaço de cor do perfil ICC deve ser um espaço de cor RGB para imagens coloridas, ou um espaço de cor monocromática em escala de cinza para imagens em tons cinzentos.
-
sBIT (Proveniente de Significant bits): Define o número original de bits significativos. Dessa forma, ele permite que os decodificadors PNG recuperem os dados originais sem perdas.
-
sRGB (Proveniente de Standard RGB colour space): Define a intenção de renderização específicada pelo International Color Consortium, sendo eles podendo ser Perceptual (quando sRGB = 0), Relative colorimetric (quando sRGB = 1), Saturation(quando sRGB = 2) e Absolute colorimetric (quando sRGB = 3).
-
bKGD (Proveniente de Background colour): Especifica uma cor de fundo padrão para apresentar a imagem.
-
hIST (Proveniente de Image histogram): Fornece a frequência de uso aproximada de cada cor na paleta de cores. Quando este se encontra presente, é obrigatório a presença do PLTE também.
-
tRNS (Proveniente de Transparency): Especifica valores alfa associados a entradas de paleta (para imagens de cores indexadas) ou uma única cor transparente (para escala de cinza e imagens de cores verdadeiras)
-
pHYs (Proveniente de Physical pixel dimensions): Especifica o tamanho/proporção em pixel pretendido para exibição da imagem. Caso este não se encontre presente, acredita-se que os pixels sejam quadrados, e o tamanho físico de cada pixel é desconhecido.
-
sPLT (Proveniente de Suggested palette): Fornece um conjunto recomendado de cores, com informações alfa e de frequência, que podem ser usadas para construir uma paleta reduzida.
-
tIME (Proveniente de Image last-modification time): Indica o tempo da última modificação de imagem, sendo estes mostrados por: Ano (2 bytes), mês (1 byte), dia, hora (1 byte), minuto (1 byte) e segundos (1 byte).
-
iTXt, tEXt, e zTXt (Todas são referente à Textual information): Usados como blocos de comentários (semelhantes à comentários de códigos).
-
Chunk | Ordem |
---|---|
IHDR | Primeiro a aparecer posteriormente dos bytes do header |
PLTE | Se estiver presente, deve vir antes do IDAT |
IDAT | Caso seja múltiplos IDATs, estes precisam ser consecutivos. |
IEND | Último chunk |
cHRM | Antes do PLTE e IDAT |
gAMA | Antes do PLTE e IDAT |
iCCP | Antes do PLTE e IDAT. Se possuir iCCP, o sRGB não pode estar presente. |
sBIT | Antes do PLTE e IDAT |
sRGB | Antes do PLTE e IDAT. Ao possuir sRGB, não pode conter iCCP. |
bKGD | Depois do PLTE e antes do IDAT |
hIST | Depois do PLTE e antes do IDAT |
tRNS | Depois do PLTE e antes do IDAT |
pHYs | Antes do IDAT |
sPLT | Antes do IDAT |
tIME | Não possuí |
iTXt | Não possuí |
tEXt | Não possuí |
zTXt | Não possuí |
O polinômio CRC aplicado é o seguinte:
x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
Os dados de cada byte são processados do bit menos significativo para o bit mais significativo. Em seguida o CRC é invertido (seu complemento é tomado). Esse valor é transmitido (armazenado no fluxo de dados) utilizando da ordem de bit mais significativo primeiro.Referências
http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html
Feito por Paulo Victor de Oliveira Andrade