Tammikuun 1. päivänä vuonna 1995 Unisys ja CompuServe alkoivat keräämään lisenssimaksuja GIF-pakkausohjelmistoista. Joukko alan ammattilaisia kokoontui ja määritteli uuden public domain- tiedostomuodon PNG:n (Portable Network Graphics), joka on julkista omaisuutta ja kaikkien halukkaiden vapaassa käytössä. PNG:n suunnittelussa lähtökohtana oli muodostaa häviötön kuvantiivistysformaatti, joka pakkaisi kuvadataa paremmin kuin muut häviöttömät tiivistysformaatit ja joka sisältäisi parannuksia ja lisäyksiä GIF-formaattiin verrattuna. Marraskuussa 1995 PNG-specifikaatio oli pääpiirteittäin valmis. Tarkempi historia PNG-formaatin synnystä löytyy www.cdrom.com/pub/png/pnghist.html.
PNG sisältää muutamia huomattavia parannuksia GIF-kuvaformaattiin verttattuna:
PNG on luotu korvaamaan GIF keskittyen kahteen pääasialliseen käyttötarkoitukseen: Web-grafiikkaan ja täysvärikuvien käsittelemiseen.
PNG:n tuki alfa-kanavan käytölle mahdollistaa web-grafiikan suunnittelemisen riippumatta siitä, millaista taustaa vasten kuva web-sivuilla asetetaan. Gamma-korjaus (gamma correction) on PNG:n ominaisuus jonka avulla voidaan kontrolloida kuvien kirkkautta laitteistosta riippumatta. PNG:n käyttämä kaksiulotteinen lomitus (two-dimensional interlacing) on kehittyneempi tapa muodostaa progressiivinen kuvaesitys kuin GIF:n vastaava. PNG:n pakkausteho on melkein kaikissa tapauksissa parempi kuin GIF:n.
Suurilla värimäärillä PNG pakkaa kuvat paremmin kuin toinen vastaava häviötön tiedostoformaatti TIFF. Lisäksi PNG:n specifikaatio on tarkemmin kiinnitetty kuin TIFF:n, jonka ansiosta kuvien siirrettävyys ohjelmasta ja järjestelmästä toiseen on helpompaa. Jos häviöllinen pakkaaminen sallitaan, ei PNG kuitenkaan yllä JPEG-pakattujen kuvien tilansäästöön.
PNG käyttää deflate/inflate -pakkausmenetelmää. Deflate on LZ77-pakkaustavan muunnos jota käyttävät mm. zip, gzip ja pkzip. PNG-tiedostossa data on pakattu käyttäen zlib-muotoa:
tiivistystapa 1 tavu lisämääreet/tarkastusbitit 1 tavu pakatut datajoukot n tavua tarkastussumma 4 tavua
Pakatut datajoukot voivat olla pakkaamattomia (raw, uncompressed), pakattuja LZ77-pakkauksella kiinnitetyin Huffman-koodein tai pakattuja LZ77-pakkauksella valinnaisilla Huffman-koodeilla. Pakattu datajoukko sisältää kahdenlaisia tietojoukkoja: todellisia (literal) tavuja ja osoittimia toistuviin merkkijonoihin (duplicated strings). Todelliset tavut sisältävät merkkijonoja joita ei ole merkitty toistuneiksi edellisessä 32 kilotavun syötteessä. Osoitin toistuvaan merkkijonoon on muotoa
Kuva 1: Datajoukkojen rakenne PNG-tiedostossa
PNG:n pakkaustehokkuutta voidaan parantaa määrittelemällä kuvalle suodatin (filter). Suodattimien tarkoituksena on esiprosessoida kuvadata ennen sen siirtämistä pakattavaksi. Tällä menetelmällä saavutetaan parannusta pakkaustiheyteen. Kyseessä ei kuitenkaan ole häviöllinen prosessi. Samaa suodatinta ei ole pakko käyttää koko kuvalle sillä jokaiselle pakattavalle riville voidaan määrätä oma suodattimensa. PNG-standardi kiinnittää joukon perussuodattimia, joista esimerkiksi yläsuodatin (up-filter) laskee käsiteltävän pikselin ja yläpuolisen pikselin erotuksen ja lähettää koodattavaksi tämän tiedon varsinaisen pikselitiedon sijasta. Koska suodatinta voidaan vaihtaa jokaisella rivillä, järkevällä suodattimien valinnalla voidaan saavuttaa huomattavaa tilansäästöä.
PNG käyttää progressiivisen kuvaesityksen muodostamiseen Adam7-nimistä lomitusmetodia. Progressiivinen esitys muodostuu seitsemästä eri tasosta, jokaisen tason tarkentaessa edellisestä tasosta saatua tulosta.
1 | 6 | 4 | 6 | 2 | 6 | 4 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
3 | 6 | 4 | 6 | 3 | 6 | 4 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
Taulukko 1: Pikseleiden läpikäyntijärjestys Adam7-lomitusmetodissa
Taulukossa 1 on havainnollistettu Adam7-lomitusmetodin käyttämää pikseleiden läpikäyntijärjestystä. Kuvaa käsitellään 8x8-lohkoissa ylhäältä alas ja vasemmalta oikealle -järjestyksessä. Jos kuvan vasen yläreuna ilmoitetaan pikseliparina (1,1), ensimmäinen läpikäynti muodostaa ensimmäisen version kuvasta käyttäen 8x8-lohkoja jotka saavat väriarvot alkuperäisen kuvan kohdista (1,1), (9,1), (17,1), ..., (1,9), (9,9) jne. Seuraava läpikäynti muodostaa 4x8-lohkoja alkuperäisen kuvan kohdista (5,1), (13,1), ..., (5,9), (13,9) jne. Kuudes läpikäynti on muodostanut kuvan josta puuttuu joka toinen vaakarivi. Seitsemäs läpikäynti täydentää puuttuvat rivit valmiiksi kuvaksi.
Kuva 2: PNG- ja GIF-kuvien lomitustapojen vertailu. Vasemmalla PNG, oikealla GIF.
Alfa-kanava (alpha channel) mahdollistaa kuvalle läpinäkyvyyden. Jokaiselle pikselille lisätään yksi ylimääräinen arvo joka kertoo pikselin läpinäkyvyysasteen. Toisin sanoen arvojen RGB lisäksi pikselille liitetään myös arvo a. Alfa-kanavalla varustetuista kuvista käytetäänkin joissain yhteyksissä nimitystä aRGB.Alfa-arvo 0 tarkoittaa täysin läpinäkyvää pikseliä ja arvo 2bittisyvyys-1 täysin läpinäkymätöntä pikseliä. Alfa-kanavan määräämät väriarvot tuloskuvaan lasketaan kaavalla
x = (a*f) + (1-a)*b
jossa a on alfa-kanavan arvo, f on alkuperäisen kuvan pikseliarvo ja b on kohdekuvan taustan pikseliarvo. On huomioitava, että PNG käsittelee kyseiset arvot reaalilukuina välillä 0-1 ja saadut tulokset pyöristetään lähimpään kokonaislukuun. Oheinen esimerkki selventää alfa-kanavan käyttäytymistä harmaasävykuvassa:
128 | 255 | 255 | 255 |
0 | 0 | 255 | 255 |
0 | 0 | 0 | 255 |
0 | 0 | 0 | 128 |
0 | 0 | 0 | 0 |
128 | 0 | 0 | 0 |
255 | 255 | 128 | 0 |
255 | 255 | 255 | 0 |
255 | 255 | 255 | 128 |
255 | 255 | 255 | 255 |
51 | 51 | 51 | 51 |
51 | 51 | 51 | 51 |
51 | 51 | 51 | 51 |
51 | 51 | 51 | 51 |
51 | 51 | 51 | 51 |
38 | 51 | 51 | 51 |
0 | 0 | 38 | 51 |
0 | 0 | 0 | 51 |
0 | 0 | 0 | 38 |
0 | 0 | 0 | 0 |
Alfa-kanava lisää luonnollisesti kuvadatan määrää. Useimmissa tapauksissa ei kuitenkaan ole tarpeen käyttää kaikkia mahdollisia läpinäkyvyyden asteita, vaan vain muutama läpinäkyvyysarvo riittää. Tällöin alfa-kanavan tarvitsema lisäinformaatio pakkautuu lopulta pieneen tilaan.
Kuva 3 havainnollistaa alfa-kanavan käytännöllisyyttä. Esimerkissä on piirretty musta ympyrä valkoista taustaa vasten käyttäen useimmista piirto-ohjelmista löytyvää anti-aliasing eli pehmennystoimintoa. Pallon ulkopuolinen alue on määrätty läpinäkyväksi. Tämän jälkeen kuva on siirretty harmaan ja punaisen taustan päälle. Näissä kuvissa on selvästi havaittavissa pallon ympärille muodostuva virhekuvio joka johtuu alkuperäisen kuvan reunojen oletusarvoisesta pehmentämisestä kohti valkoista. Alhaalla oikealla on piirtovaiheessa luotu pallon reunalle omat alfa-arvonsa ja tulos näyttää halutulta myös harmaata taustaa vasten.
Kuva 3: Esimerkki alfa-kanavan käytöstä.
Gamma-korjauksen (gamma correction) avulla voidaan korjata kuvan kirkkaudessa tapahtuvia vääristymiä siirryttäessä järjestelmästä toiseen. PC:llä tehty kuva ei näy yhtä kirkkaana Machintosh-ympäristössä tai SGI-työasemassa. Jopa eri PC-laitteiden välillä on eroja kuvakirkkauden tasoissa. PNG-tiedostoon voidaan lisätä tieto siitä, millä kirkkaudella kuva tulisi esittää. Dekoodaaja korjaa purettavan kuvan kirkkautta käyttämällä hyväkseen PNG-tiedostosta löytyvää gamma-tietoa ja käytetyn järjestelmän omia kirkkausasetuksia.
Siirrettäessä kuvatiedostoja saattaa siirrossa tapahtua virheitä. PNG sisältää kolme tapaa tarkastaa annetun tiedoston oikeellisuus.