PNG-kuvaformaatti

1. Historiaa

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.

2. PNG vastaan GIF

PNG sisältää muutamia huomattavia parannuksia GIF-kuvaformaattiin verttattuna:

  • GIF tukee enintään kahdeksaa bittiä per pikseli, PNG tukee kolmea päätyyppiä; harmaasävy, palettikuva ja 48-bittinen true color.
  • GIF-kuvassa voidaan yksi väreistä määrätä läpinäkyväksi, PNG tukee omaa alfa-kanavaa.
  • GIF mahdollistaa animaation, PNG ei sisällä animaatio-ominaisuutta mutta kehitteillä on oma, pelkästään animaatiolle tarkoitettu MNG (Multiple-image Network Graphics)-formaatti.
  • PNG pakkaa kuvan keskimäärin 5-25% paremmin kuin GIF.
  • PNG-kuviin voidaan lisätä teksti-informaatiota helpottamaan mm. tietokantakäsittelyä ja Internetin hakuagenttien toimintaa.

    3. PNG:n käyttökohteet

    PNG on luotu korvaamaan GIF keskittyen kahteen pääasialliseen käyttötarkoitukseen: Web-grafiikkaan ja täysvärikuvien käsittelemiseen.

    3.1 Web-grafiikka

    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.

    3.2 Täysvärikuvien käsittely

    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.

    4. PNG:n pakkaustapa

    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 , jossa pituus on toistuvan merkkijonon pituus ja etäisyys on etäisyys tarkastelukohdasta taaksepäin kohtaan, jossa toistuva merkkijono esiintyy. Todelliset tavut, pituudet ja etäisyydet ovat esitetty käyttäen Huffman-koodia jossa on oma koodipuunsa todellisille tavuille ja pituuksille sekä erillinen koodipuu etäisyyksille.

    Kuva 1: Datajoukkojen rakenne PNG-tiedostossa

    4.1 Tiivistyssuodattimet

    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öä.

    4.2 Lomitus ja progressiivinen kuvaesitys

    PNG käyttää progressiivisen kuvaesityksen muodostamiseen Adam7-nimistä lomitusmetodia. Progressiivinen esitys muodostuu seitsemästä eri tasosta, jokaisen tason tarkentaessa edellisestä tasosta saatua tulosta.

    16462646
    77777777
    56565656
    77777777
    36463646
    77777777
    56565656
    77777777

    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.

    5. Alfa-kanava

    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:

    128255255255
    00255255
    000255
    000128
    0000
    Alkuperäinen kuva

    128000
    2552551280
    2552552550
    255255255128
    255255255255
    Alfa-kanava
    (255 = läpinäkymätön pikseli, 128 = "puoliksi" läpinäkyvä pikseli, 0 = täysin läpinäkyvä pikseli)

    51515151
    51515151
    51515151
    51515151
    51515151
    Uusi tausta

    38515151
    003851
    00051
    00038
    0000
    Alkuperäinen kuva + uusi tausta

    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ä.

    6. Gamma-korjaus

    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.

    7. Tiedostojen oikeellisuuden tarkastus

    Siirrettäessä kuvatiedostoja saattaa siirrossa tapahtua virheitä. PNG sisältää kolme tapaa tarkastaa annetun tiedoston oikeellisuus.

  • "Magic signature": PNG-tiedoston alussa oleva 8-bittinen tunniste jonka avulla tarkastetaan yleisin tiedoston siirrossa tapahtunut virhe: Tiedosto on siirretty käyttäen ASCII-moodia binaari-moodin sijasta.
  • 32-bittinen cyclic redundancy check (CRC-32): CRC-32:lla voidaan huomata yhdenkin bitin virhe tiedostossa. Kuvatiedoston virheellisyys/virheettömyys voidaan testata ilman että kuvaa tarvitsee dekoodata.
  • Adler-32 tarkastussumma: Kohdistuu purettuun dataan. Adler-32:lla voidaan tarkastaa virheet jotka ovat muodostuneet enkoodaus- tai dekookausvaiheessa.

    Tiivistystuloksia
    PNG-lähteitä verkossa