PNG
Extensão | .PNG |
---|---|
Tipo MIME | image/png |
Assinatura | 89 50 4E 47 0D 0A 1A 0A( hexa ) |
Desenvolvido por | W3C |
Versão inicial | 1 r de Outubro de de 1996 |
Tipo de formato | formato de imagem de matriz sem perdas |
Baseado em | Esvaziar |
Padrão | ISO 15948 , W3C , IETF RFC 2083 |
ISO | 15948 |
Especificação | Formato aberto |
Sites |
(en) www.libpng.org/pub/png (en) png-mng.sourceforge.net/pub/png |
O Portable Network Graphics ( PNG ) é uma tela aberta a imagens digitais , que foi criada para substituir o formato GIF , na época dono e cuja compactação estava sujeita a patente . PNG é um formato sem perdas especialmente adaptado para a publicação de imagens, incluindo cores planas simples.
Foi padronizado pela ISO (ISO / IEC 15948: 2004).
PNG é uma especificação para a Internet e é objeto de uma recomendação do W3C e de um RFC . Foi criado para contornar a licença existente no formato GIF, o mais popular no final da década de 1990, da Unisys , detentora de duas patentes sobre algoritmos usados por compressão sob GIF tendo reclamado royalties. O PNG foi então definido, mas aumentando os recursos do GIF.
PNG é particularmente adequado quando se trata de salvar imagens sintéticas destinadas à Web , como gráficos, ícones , imagens que representam texto (boa preservação de legibilidade) ou imagens com gradientes. O PNG supera consistentemente o GIF em termos de redução do tamanho do arquivo (com um esquema de cores bem escolhido) ou qualidade (uma vez que não está limitado a 256 cores ).
As características do PNG permitem salvar fotografias sem perda de dados , em detrimento do tamanho do arquivo que é logicamente muito maior do que os formatos de perda de dados destinados a fotografias, como JPEG ou JPEG 2000 .
PNG permite principalmente que você salve imagens raster em diferentes formatos :
Depois de aplicar um filtro preditivo que geralmente permite obter níveis mais elevados de compressão , tudo é comprimido sem perdas seguindo o algoritmo deflate ( RFC 1951 ), geralmente com zlib , mas zopfli também pode ser usado com aplicativos como advpng.
Os componentes de pixel ou entradas de paleta são fornecidos no formato RGB (vermelho, verde, azul) ou no formato RGBA (com um canal alfa adicional para translucidez). Nesse caso, 8 ou 16 bits adicionais são usados por pixel ou por entrada de paleta, o que resulta em 16 bits para uma imagem em tons de cinza, 32 bits para uma imagem em cores reais e 64 bits para uma imagem de 4 canais de 16 bits cada.
A presença de um canal alfa definindo diferentes níveis de transparência o torna ideal para composição em páginas da web. Esse recurso é bem implementado pela maioria dos navegadores da web .
Quando a imagem PNG usa uma paleta de até 256 cores, é possível usar uma das cores para transparência.
Este é o mesmo comportamento do formato GIF e funciona até mesmo com o Internet Explorer 6 . Portanto, as imagens da web no formato GIF podem ser convertidas para esta versão do PNG sem medo de incompatibilidade com a maioria dos navegadores da web atuais (primeiro trimestre de 2006) e sem preocupações com patentes (a patente GIF caiu em 2006 no domínio público ).
PNG, aliás às vezes recursivamente referido como PNG's Not GIF ( PNG não é GIF ), pode fazer tudo o que o GIF pode fazer e mais, como translucidez . No entanto, não se destinava a fazer imagens em movimento, mas o formato derivado MNG foi criado pelos seus autores para este fim (ver também o formato APNG ).
Ambos os formatos podem ser entrelaçados , mas PNG usa o algoritmo Adam7 enquanto GIF, neste caso, exibe a imagem linha por linha.
Um " pedaço " é um grande pedaço do arquivo, um fragmento de informação que constitui uma entidade. Este termo em inglês é usado em muitos formatos de multimídia.
Um arquivo pode conter vários blocos de dados IDAT, bem como um bloco PLTEpara a paleta usar, se for uma imagem cujas cores são indexadas.
Um arquivo também pode conter outros blocos secundários, incluindo informações textuais.
Arquivo inicia um PNG com uma assinatura de 8 bytes representados pelos seguintes valores decimais 137 80 78 71 13 10 26 10ou hexadecimal: 89 50 4E 47 0D 0A 1A 0A.
O resto do arquivo é dividido em várias partes de comprimentos variados, chamadas de pedaços.
Existem 18 blocos oficiais, incluindo 4 primários e 14 secundários.
Os pedaços são rotulados (nomeados). A quebra é importante nos nomes dos pedaços . Cada rótulo é definido por quatro caracteres sucessivos, definindo um código mnemônico , na forma de fourCC . Para cada bloco , se a primeira letra de seu nome estiver em maiúscula, é um bloco crítico, caso contrário, é um bloco auxiliar.
Aqui está uma tabela dos blocos mais usados (os quatro principais na liderança):
Sobrenome | Descrição | Contém | Importância | Ocorrência |
---|---|---|---|---|
IHDR |
Cabeçalho da imagem Cabeçalho do arquivo |
Largura da imagem em pixels |
Obrigatório | Depois de assinar PNG |
PLTE |
Paleta de imagens |
Tabela de cores | Opcional | Entre IHDRe a um r pedaçoIDAT |
IDAT |
Bloco de dados de dados de imagem |
Dados de imagem | Obrigatório | Entre IHDRou PLTEeIEND |
IEND |
Trailer da imagem Fim do arquivo |
nada | Obrigatório | por último |
tIME |
Data e hora da última modificação da imagem |
Opcional | Em qualquer lugar | |
iTXt |
Dados textuais internacionais Informações de texto internacional (talvez zlib compactado) |
Opcional | Em qualquer lugar | |
tEXt |
Dados textuais Informação textual não comprimida |
Opcional | Em qualquer lugar | |
zTXt |
Dados textuais compactados Informações textuais compactadas (zlib) |
Opcional | Em qualquer lugar |
Os outros dez blocos secundários são:
bKGD Cor de fundo | pHYs Dimensões físicas do pixel |
cHRM Cromaticidades primárias e ponto branco | sBIT Bits significativos |
gAMA Imagem gama | sPLT Paleta sugerida |
hIST Histograma de imagem | sRGB Espaço de cor RGB padrão |
iCCP Perfil ICC incorporado | tRNS Transparência |
Outros pedaços também podem ser definidos. Eles são públicos ou privados, mas devem atender às regras de nomenclatura. Um bloco público deve ter sido registrado no W3C , a autoridade designada pela ISO / IEC .
Aqui estão os blocos públicos em uso:
dSIG Assinatura digital | oFFs Imagem deslocada |
eXIf Perfil de formato de imagem intercambiável (Exif) | pCAL Calibração de valores de pixel |
fRAc Parâmetros de imagem fractal | sCAL Escala física do assunto da imagem |
gIFg Extensão de controle gráfico GIF | sTER Indicador de imagem estéreo |
gIFx Extensão de aplicativo GIF |
Um pedaço é composto por 4 partes:
COMPRIMENTO | MODELO | DATAS | CRC |
---|---|---|---|
Comprimento de dados | Tipo de pedaço | Dados cujo comprimento em bytes é especificado em LENGTH | Ao controle |
4 bytes | 4 bytes | n bytes | 4 bytes |
LENGTH: o tamanho em bytes do bloco, apenas seus dados. Não levamos em consideração o tamanho, tipo ou CRC.
TIPO: O nome do pedaço (por exemplo IHDR, IDAT, IENDetc.).
DATAS: Informações relacionadas ao bloco em n bytes (relacionado a COMPRIMENTO).
CRC: 4 bytes de verificação gerados usando o seguinte algoritmo:
fonction maj_crc((entier positif 4 octets) crc, (entier positif 1 octet) bloc(), (entier positif 4 octets) taille) //le premier argument, crc, lors du premier appel de cette fonction pour un chunk donné, doit être 0xffffffff (tous les bits à 1) //sinon, il doit s'agir de la valeur retournée par le précédent appel de cette fonction //le deuxième argument, bloc(), est une liste d'éléments d'un octet. Il s'agit de tout ou partie du chunk //le troisième argument, taille, est le nombre d'éléments de la liste bloc() (entier positif 4 octets) c, n, v c=crc pour n de 0 à (taille-1) //normalement, cette boucle ne contient qu'une seule instruction mais, ici, elle est subdivisée en quatre instructions. C'est plus lisible ainsi //il y a une itération de cette boucle pour chacun des octets de la partie DATA du chunk, dans l'ordre de leurs positions dans le chunk //xb=ou exclusif bit à bit v=c xb bloc(n) //eb=et bit à bit; tout nombre préfixé par 0x est en base 16 //on met à 0 les bits des trois premiers octets, vu que leur valeur ne dépend pas de celle de bloc(n) v=v eb 0xff //table_crc() est une liste de 256 constantes, des entiers codés sur quatre octets (voir ci-dessous) v=table_crc(v) //div=division entière c=v xb (c div 256) fin pour retourner c fin fonctionUma vez que todo o chunk foi varrido, o valor retornado pela última chamada para maj_crc () não é aquele do crc. ainda é preciso inverter o valor de cada bit:
fonction validation_crc((entier positif 4 octets) crc) retourner (crc xb 0xffffffff) fin fonctionA lista table_crc () em maj_crc () consiste em valores arbitrários, mas calculáveis. algumas implementações listam esses valores (calculados com antecedência) e os armazenam diretamente na variável, enquanto outras contêm o algoritmo (geralmente uma função) para calculá-los:
fonction calcul_table_crc() (entier positif 4 octets) c, i, j pour i de 0 à 255 c=i //8 itérations pour j de 0 à 7 //retourne 0 (faux) si c est pair et 1 (vrai) si c est impair (en dehors du dernier,tous les bits du résultat sont à 0) si (c eb 1) //la valeur 0xedb88320 (11101101 10111000 10001100 00100000 en binaire et 3 988 292 384 en décimal) est arbitraire //c étant, dans ce cas, nécessairement impair, c div 2 équivaut à (c-1)/2 c=0xedb88320 xb (c div 2) sinon c=c/2 fin si fin pour table_crc(i)=c fin pour fin fonctionO exemplo de bloco IHDRconsiste nos seguintes dados binários, representados aqui em hexadecimal:
00 00 00 0D 49 48 44 52 00 00 03
20 00 00 02 58 10 06 00 00 00 15
14 15 27
Esses dados devem ser interpretados de acordo com a tabela.
Dados (em hexadecimal) |
Descrição | Valor (em decimal) |
---|---|---|
00 00 00 0D | Comprimento de dados | 13 |
49 48 44 52 | Tipo / nome do bloco | IHDR |
00 00 03 20 | Largura | 800 |
00 00 02 58 | Altura | 600 |
10 | Profundidade de bits | 16 |
06 | Tipo de cor | 6 |
00 | Método de compressão | 0 |
00 | Método de filtragem | 0 |
00 | Método de entrelaçamento | 0 |
15 14 15 27 | CRC | 353637671 |
O método de compressão 0especificado em IHDR(o único possível no formato PNG) refere-se à compressão Deflate / Inflate . A compactação é feita apenas nos dados do bloco IDAT.
A compactação pode ser feita usando a biblioteca zlib (C / C ++). Também é possível gerar o CRC usando esta biblioteca.
Outros formatos: