PicScrub logoPicScrub
Terug naar de formaten

Het PNG-formaat

Portable Network Graphics

Een structuur van chunks

PNG heeft een van de netste bestandsformaten die er zijn. Alles is ingedeeld in "chunks": op zichzelf staande blokken met een type, data en een checksum. Het mooie is dat decoders chunks die ze niet kennen gewoon kunnen overslaan, en dat is precies waarom PNG metadata kan ondersteunen zonder oudere software in de war te brengen.

De slimmigheid zit in de naamgeving van de chunks: begint de naam met een hoofdletter, dan is de chunk "critical" (zonder die chunk wordt de afbeelding niet weergegeven). Een kleine letter betekent "ancillary": mooi meegenomen, maar niet noodzakelijk. Alle metadata-chunks waar het ons om gaat zijn ancillary, en daarom kunnen we ze veilig weghalen.

Structuur van een PNG-bestand

Signature
IHDR
Metadata
IDAT
IEND
Signature
8 bytes
89 50 4E 47 0D 0A 1A 0A
IHDR
25 bytes
Header van de afbeelding (verplicht)
Metadata
100 bytes
tEXt-, iTXt- en eXIf-chunks
IDAT
Variabele lengte
Gecomprimeerde beeldgegevens
IEND
12 bytes
Marker voor het einde van de afbeelding

De PNG-signature en IHDR

PNG-signature
Lengte van IHDR (13)
Type IHDR
Breedte (256)
Hoogte (256)
Bitdiepte, kleurtype en zo verder
OffsetHexASCII
0000
89504E470D0A1A0A0000000D49484452
.PNG........IHDR
0010
00000100000001000802000000000000
.............

Opbouw van een chunk

LengthTypeDataCRC32
4 bytes4 bytesVariabel4 bytes

Hoe de namen van chunks werken

  • • Eerste letter een hoofdletter = critical chunk (moet worden begrepen)
  • • Eerste letter een kleine letter = ancillary chunk (optioneel, mag genegeerd worden)
  • • Tweede letter = public (hoofdletter) of private (kleine letter)

Critical chunks

Deze chunks moeten aanwezig zijn en begrepen worden, anders is de afbeelding niet geldig. PicScrub laat critical chunks altijd staan.

IHDR:header van de afbeelding

De eerste chunk na de signature. Bevat de breedte, hoogte, bitdiepte, het kleurtype, de compressiemethode, de filtermethode en de interlace-methode. Precies 13 bytes aan data.

IDAT:beeldgegevens

Bevat de gecomprimeerde beeldgegevens (zlib/deflate). Kan over meerdere IDAT-chunks verdeeld zijn. Alle IDAT-chunks moeten na elkaar staan.

IEND:einde van de afbeelding

Markeert het einde van de PNG-datastroom. Moet de laatste chunk zijn. Bevat nul databytes.

PLTE:palet

Verplicht bij afbeeldingen met een indexkleur (kleurtype 3). Bevat 1–256 RGB-paletwaarden.

Metadata-chunks

Ancillary chunks die gevoelige metadata kunnen bevatten. Dit zijn de chunks die PicScrub verwijdert.

tEXt:tekst zonder compressie

Sleutel-waardeparen in Latin-1. Veelgebruikte sleutels: Author, Description, Copyright, Creation Time, Software.

Opbouw: keyword + null + tekst

zTXt:gecomprimeerde tekst

Hetzelfde als tEXt, maar met zlib-compressie. Wordt gebruikt voor langere teksten.

iTXt:internationale tekst

UTF-8-tekst, eventueel gecomprimeerd. Ondersteunt taalcodes en vertaalde keywords. Wordt gebruikt voor XMP-metadata.

XMP-keyword: XML:com.adobe.xmp\0

eXIf:EXIF-gegevens

In 2017 geregistreerd als PNG-extensie. Bevat ruwe EXIF-gegevens in TIFF-formaat, met dezelfde structuur als EXIF in JPEG. Kan GPS, datum en tijd en apparaatgegevens bevatten.

iCCP:ICC-kleurprofiel

Een ingesloten ICC-kleurprofiel, gecomprimeerd met zlib. PicScrub laat het standaard staan, zodat de kleuren blijven kloppen.

tIME:tijd van de laatste wijziging

Zeven bytes: jaar (2), maand, dag, uur, minuut, seconde. Verraadt wanneer de afbeelding voor het laatst is gewijzigd.

Chunks die met kleur te maken hebben

Deze chunks bepalen hoe de kleuren worden weergegeven, maar bevatten normaal gesproken geen persoonlijke informatie. PicScrub laat ze standaard staan.

sRGB

Geeft de sRGB-kleurruimte aan. Eén byte voor de rendering intent.

gAMA

De gammawaarde als unsigned integer van 4 bytes (maal 100.000).

cHRM

De primaire chromaticiteiten en de coördinaten van het witpunt.

sBIT

De oorspronkelijke bitdiepte per kanaal.

Controle met CRC32

Elke PNG-chunk bevat een CRC32-checksum die is berekend over het type en de data van de chunk. Zo blijft de integriteit van de gegevens gegarandeerd.

De CRC-berekening

CRC32-invoer = chunk_type (4 bytes) + chunk_data (N bytes)
CRC32-uitvoer = 4 bytes achter de data van de chunk

// PNG gebruikt de CRC-32-polynoom: 0xEDB88320

Waarom PicScrub de CRC controleert

Bij het lezen van PNG-bestanden controleert PicScrub de CRC van elke chunk, zodat de gegevens intact zijn. Beschadigde chunks worden netjes afgehandeld.

Hoe PicScrub PNG verwerkt

1

De signature controleren

Kijken of de PNG-signature klopt: 89 50 4E 47 0D 0A 1A 0A

2

De chunks parsen

Van elke chunk de lengte en het type lezen en de CRC controleren

3

Metadata-chunks eruit filteren

tEXt-, zTXt-, iTXt-, eXIf- en tIME-chunks herkennen en overslaan

4

Het bestand opnieuw opbouwen

De signature, de overgebleven chunks en IEND wegschrijven

Chunks die blijven

  • • IHDR, PLTE, IDAT, IEND (critical)
  • • sRGB, gAMA, cHRM (kleur)
  • • iCCP (kleurprofiel, optioneel)
  • • pHYs (pixelafmetingen)
  • • tRNS (transparantie)

Chunks die weggaan

  • • tEXt (tekstmetadata)
  • • zTXt (gecomprimeerde tekst)
  • • iTXt (internationale tekst, XMP)
  • • eXIf (EXIF-gegevens)
  • • tIME (tijd van wijziging)