# PNG

PNG (Portable Network Graphics) é um formato de dados utilizado para imagens, que surgiu em 1996 como substituto para o formato GIF, devido ao facto de este último incluir algoritmos patenteados.
Esse formato livre é recomendado pela W3C, suporta canal alfa, tem uma maior gama de profundidade de cores, alta compressão (regulável), além de outras características.
Além disso, o formato PNG permite comprimir as imagens sem perda de qualidade e retirar o fundo de imagens com o uso do canal alfa. O canal alfa, diferentemente da transparência do GIF, é capaz de definir o nível de opacidade de cada pixel, adequando-se a qualquer fundo de um site ou apresentação, sem serrilhamento, algo que não se consegue com os outros formatos populares. Por isso é um formato válido para imagens que precisam manter 100% da qualidade para reuso. Pode ser usado na maioria dos programas de edição de imagens como o Adobe Fireworks (proprietário) e o GIMP (livre).
Os arquivos PNG usam a extensão de arquivo PNG ou png e foi registrado como um tipo de mídia pela MIME image/png PNG foi publicado como informativo RFC 2083 em março de 1997 e como padrão ISO/IEC 15948 em 2004.

## História e desenvolvimento

A motivação para criar o formato PNG surgiu em 28 de dezembro de 1994, quando veio a público que o algoritmo de compressão de dados LZW, utilizado no GIF, havia sido patenteado pela Unisys. A patente exigia que todos softwares que suportassem GIF pagassem royalties. Essa patente levantou discussões entre usuários no Usenet, um desses usuários foi Thomas Boutell, que, em 4 de janeiro de 1995, abriu um tópico de discussão no Usenet no qual ele elaborou um plano de uma alternativa gratuita ao GIF. Muitos usuários ajudaram com propostas que mais tarde iria fazer parte do formato final. Oliver Fromme propôs o nome PING, que acabou se tornando PNG um acrônimo recursivo que significa PNG não é GIF, e também a extensão .png.
Havia também outros problemas com a GIF que tornaram a substituição desejável, como, por exemplo, a sua limitação a 256 cores num momento em que computadores com capacidade para exibir uma gama maior de cores tornavam-se comuns. Embora o GIF permita animações, foi decidido que o PNG deveria ser um formato estático de imagem.
Um formato “companheiro” chamado Multiple-image Network Graphics (MNG) foi definido para animação. O MNG teve suporte moderado a softwares, mas não foi muito utilizado em navegadores e não houve uso entre os designers e desenvolvedores de site. Já em 2008, alguns programadores da Mozilla publicaram o formato Animated Portable Network Graphics (APNG) com objetivos semelhantes. APNG foi nativamente suportado em navegadores baseados em Gecko e Presto e também foi usado nas logo do Playstation Portable (PSP). Em 2017, navegadores baseados em Chromium adotou o suporte ao APNG. Em janeiro de 2020, Microsoft Edge tornou-se baseado em Chromium, levando consigo o suporte ao APNG. Com isso, agora todos os principais navegadores suportam o APNG.
* 1 de outubro de 1996 — versão 1.0 da especificação PNG é lançada, e depois apareceu como RFC 2083 . Tornou-se uma recomendação da W3C em 01-10-1996.
* 31 de dezembro de 1998 — versão 1.1 com pequenas modificações é lançada.
* 11 de agosto de 1999 — é lançada a versão 1.2.
* 10 de novembro de 2003 — PNG torna-se um padrão internacional (ISO/IEC 15948:2003). Esta versão do PNG pouco difere da 1.2.
* 3 de março de 2004 — ISO/IEC 15948:2004. ==

## Funcionamento
### Cabeçalho do arquivo

O arquivo PNG começa com uma assinatura composta por uma assinatura de 8 bytes. 89 50 4E 47 0D 0A 1A 0A
| Valores (hex) | Propósito |
| 89 | Tem o bit alto definido como 1 para detectar sistemas de transmissão que não suportam dados de 8 bits e para reduzir a chance de um arquivo de texto ser interpretado incorretamente como PNG ou vice-versa. |
| 50 4E 47 | Em ASCII, são as letras "PNG", permitindo que uma pessoa identifique o formato facilmente caso for ver em um editor de texto. |
| 0D 0A | Uma nova linha em DOS (CRLF) para detectar as conversões de final de linha entre DOS e UNIX. |
| 1A | Um byte que interrompe a exibição do arquivo no DOS quando o comando TYPE é usado. |
| 0A | Uma nova em Unix (LF) para detectar a conversão de final de linha Unix e DOS. |

### Segmentos do arquivo

Após o cabeçalho, há vários segmentos, cada segmento transmite determinadas informações sobre a imagem. Os segmentos se declaram como pontos críticos (critical) ou auxiliares (ancillary), e um programa, caso encontre um segmento auxiliar e não entenda, pode ignora-lo sem correr riscos.
Essa estrutura baseada em segmentos foi criada para estender o formato PNG, mas, ainda assim, mantendo compatibilidade com versões mais antigas.
Um bloco consiste em quatro partes: tamanho (4 bytes, big-endian ), tipo/nome do segmento (4 bytes), dados do segmento (bytes de comprimento) e CRC (código de redundância cíclica/soma de verificação; 4 bytes). O CRC é um CRC-32 de big-endian calculado sobre o tipo de segmento e os dados de segmento, mas não o tamanho.
Os segmentos têm um nome de 4 letras que diferencia maiúsculas de minúsculas. O uso de maiúsculas ou minúsculas nesse nome fornece informações aos decodificadores sobre os segmentos que não são reconhecidas.
Se a primeira letra for maiúscula indica que o segmento é essencial, caso contrário será auxiliar. Os segmentos essenciais são necessárias para ler o arquivo, se o decodificador encontrar uma seção essencial que não reconhece, deve abortar a leitura.
Se a segunda letra for maiúscula, significa que o segmento é público na especificação ou no registro do segmento para fins especiais, caso contrário será privada (não padronizada). Esse uso de maiúsculas e minúsculas garante que nunca haja conflitos entre os segmentos públicos e privados.
A terceira letra deve ser maiúscula para atender às especificações do PNG. Está reservada para expansão futura.
A quarta letra indica se é seguro copiar o segmento caso não seja reconhecida, se estiver em minúsculas é seguro copiar o segmento independentemente da quantidade de modificação que o arquivo tenha sofrido, se estiver em maiúscula deve apenas ser copiado se não houver segmentos críticos que sofreram modificações.

#### Segmentos essenciais

Um decodificador deve ser capaz de interpretar esses segmentos para ler e renderizar um arquivo PNG:
* IHDR, deve ser o primeiro segmento, contém o cabeçalho.
* PLTE, contém a paleta (lista de cores).
* IDAT, contém a imagem que deve ser dividida em vários segmentos IDAT, isso aumenta um pouco o tamanho da imagem, mas possibilita a geração de imagens PNG em streaming.
* IEND, marca o fim da imagem.