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
De PNG-signature en IHDR
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 89504E470D0A1A0A0000000D49484452 | .PNG........IHDR | |||||||||||||||
| 0010 | 00000100000001000802000000000000 | ............. | |||||||||||||||
Opbouw van een chunk
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.
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.
XML:com.adobe.xmp\0eXIf: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
De signature controleren
Kijken of de PNG-signature klopt: 89 50 4E 47 0D 0A 1A 0A
De chunks parsen
Van elke chunk de lengte en het type lezen en de CRC controleren
Metadata-chunks eruit filteren
tEXt-, zTXt-, iTXt-, eXIf- en tIME-chunks herkennen en overslaan
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)