Hoppa till innehållet

PNG

Från Wikipedia
För landet, se Papua Nya Guinea.
PNG
Filändelse.png
MIME-typimage/png
TypkodPNGf
Uniform typidentifierarepublic.png
Utvecklad avPNG Development Group (donerad till W3C)
Typ av formatFörlustfritt bildformat
Utökad tillAPNG, JNG och MNG
StandardISO 15948, IETF RFC 2083

Portable Network Graphics (PNG) är ett format för digitala bilder. PNG är speciellt vanligt för icke-fotografiska bilder på Internet, som ikoner, ritningar, grafik med mera. Delvis utvecklades PNG som en ersättare för den åldrade och juridiskt omstridda GIF-standarden och har därför många av det formatets möjligheter men utan de allvarliga begränsningarna.

PNG är, liksom GIF, en typ av icke-förstörande komprimering. Med andra ord kommer en bild som komprimeras som PNG att vara likadan som originalet efter dekomprimering. PNG fungerar bäst på bilder med stora, enfärgade områden. För att vara en icke-förstörande komprimering presterar den förhållandevis väl även på exempelvis fotografier, men kommer inte i närheten av den kompressionsgrad som kan uppnås med förstörande komprimering, exempelvis JPEG.

Tekniska detaljer

[redigera | redigera wikitext]

PNG kan använda upp till 48 bitar för att beskriva färg i formatet RGB. PNG har även stöd för en alfakanal för representation av transparens. I de fall det inte är lämpligt att beskriva varje pixels färg med RGB finns det möjlighet att använda en palett med upp till 256 färger.

Det finns även mer avancerad funktionalitet så som möjlighet till inbäddad ICC-profil och/eller möjlighet att definiera pixlarnas fysiska dimensioner.

PNG erbjuder ett flertal modeller för att representera en bild. Modellerna skiljer sig genom hur färgerna och den eventuella transparensen representeras. Modellerna är som följer.

Kodningsprocessen

[redigera | redigera wikitext]

Innan en bild kan kodas som en PNG-dataström måste ett antal transformationer utföras på ursprungsbilden.[1]

  1. En eventuell transparens utvinns ur bilden och sparas i en separat alfakanal.
  2. Beroende på vilken färgrepresentation som valts görs olika transformationer.
    • Ifall palett har valts som färgrepresentation skapas nu en tabell innehållande 256 färger och eventuell alfainformation. Värdena i tabellen är representativa för färgerna i ursprungsbilden. Bildens alla pixlar ersätts sedan med referenser till dessa färger.
    • Om RGB valts som färgrepresentation görs två transformationer.
      1. Här kan de tre olika färgerna röd, grön och blå som utgör RGB slås ihop till en gråskala. Bilden blir då svartvit men kräver mindre lagringsutrymme än en svartvit bild representerad i RGB.
      2. I de fall bilden innehåller ett RGB-värde där alla pixlar med det värdet är helt transparenta samt resterande pixlar inte har någon transparens. I ett sådant fall kan alfakanalen skippas och enbart den specifika RGB-färgen indikeras som transparent.
  3. PNG stöder ett förbestämt antal färgdjup. I vissa fall överensstämmer inte ursprungsbildens färgdjup med någon av de tillåtna färgdjupen. I dessa fall sker en linjär översättning av ursprungsbildens färger till det närmast större tillåtna färgdjup. Detta är en helt reversibel process då information om ursprungsbildens färgdjup finns i PNG-dataströmmen.

Processen att koda själva PNG-dataströmmen består av ett flertal steg. I varje steg utförs ett antal operationer på den matris av pixlar som ursprungsbilden består av. Dessa operationer resulterar i en PNG-dataström som kan sparas till fil eller skickas över önskat medium.

Kodningsprocessens steg

Pass extraction

[redigera | redigera wikitext]

Bilden delas upp i ett flertal mindre delbilder även kallade reducerade bilder. Varje av dessa reducerade bilder motsvarar en grovkornig version av ursprungsbilden. Tanken är att ju fler reducerade bilder som innehas desto mer komplett blir bilden. Detta möjliggör att bilden kan börja visas innan hela bilden överförts, om än i en mindre detaljrik version. Under överföringsprocessen blir bilden progressivt mer detaljrik. Detta kan vara önskvärt vid till exempel visning av bilder på webben.

PNG-standarden definierar 2 metoder för pass extraction.

  • Null metoden är den enklaste formen av pass extraction. Denna metod resulterar i 1 reducerad bild. Originalbilden läses sekventiellt från vänster till höger, rad för rad uppifrån och ner. Varje rad i den reducerade bilden motsvaras av en rad i originalbilden. Detta innebär att den reducerade bilden är identisk med originalbilden.
  • Adam7 är en mer komplicerad metod för pass extraction. Denna metod resulterar i 7 stycken reducerade bilder. Vilka pixlar från originalbilden som placeras i vilken av dessa 7 reducerade bilder bestäms av en 8 x 8 matris. Denna matris har egenskapen att varje rad i den reducerade bilden blir lika lång.
Exempel på hur Adam7 delar originalbilden
Adam7

Scanline serialization

[redigera | redigera wikitext]

Varje rad i den reducerade bilden, en så kallad scanline, representeras av en sekvens av bytes.

För att göra den efterföljande komprimeringen mer effektiv appliceras på varje scanline i den reducerade bilden ett filter. Dessa filter transformerar datan på så sätt att den blir mer komprimerad men bibehåller möjligheten att återställa ursprungsdatan. Teorin är att minska mängden information i varje pixel genom att göra dem beroende på sina närliggande pixlar. PNG-standarden beskriver 5 typer av filter varav en innebär att ingen filtrering görs.

De olika filtreringstyperna beräknar för varje pixel ett nytt värde som får representera färgen i den pixeln. Detta görs genom att pixelns aktuella värde subtraheras med ett värde som fås genom manipulation av några närliggande pixlars värden. De olika filtreringstyperna skiljer sig genom vilka manipulationer som utförs samt vilka närliggande pixlar som används.

Filtreringstyperna ger varierande vinst vid komprimering beroende på hur originalbilden ser ut. För att öka effektiviteten tillåter PNG-standarden att olika filtertyper väljs på olika scanlines. Detta medför att filtreringstyp kan väljas med avseende på hur just den aktuella scanlinen och eventuellt också dess närliggande scanlines ser ut.

Resultatet av filtreringen är inte en mindre mängd data. Istället återfås scanlines med samma längd som tidigare, plus att varje scanline nu föregås av en byte som indikerar vilken av de olika filtreringstyperna som använts vid kodningen. Något som är nödvändigt att veta vid avkodningen. [2]

Komprimering

[redigera | redigera wikitext]

Alla scanlines slås ihop till en lång sekvens. Denna sekvens komprimeras med deflate-komprimering med den begränsningen att det glidande fönstret (en. sliding window) får som störst vara 32768 bytes. Den komprimerade dataströmmen är i formatet zlib.[3]

Vid styckningen (en. Chunking) skapas ett flertal så kallade stycken (en. chunks). Det är dessa stycken som bygger upp själva PNG-dataströmmen. Datan från föregående steg paketeras i IDAT-stycken. IHDR-stycke skapas med information om PNG-dataströmmen. Även ett IEND-stycke och eventuella underordnade stycken skapas.

PNG-standarden definierar ett flertal styckestyper. De erbjuder olika egenskaper som kan adderas till PNG-dataströmmen. Några av typerna är obligatoriska men de flesta är valfria. Det finns även möjlighet att definiera nya typer och på så sätt utöka PNG:s funktionalitet. Om funktionaliteten utökas på detta sätt krävs dock att både kodaren och avkodaren implementerar denna utökade funktionalitet.

Styckestyperna är indelade i två kategorier. De kritiska (stycken som är obligatoriska) och de underordnade vilka är valfria.

Dataströmmens uppbyggnad

[redigera | redigera wikitext]

För att en PNG-dataström skall vara korrekt skall den inledas med en 8 byte stor signatur.

PNG-signaturen i decimal representation[4]

137 80 78 71 13 10 26 10

Signaturen skall efterföljas av ett IHDR-stycke följt av minst ett IDAT-stycke och avslutas med ett IEND-stycke. De eventuella underordnade styckena placeras enligt deras specifikation. Antingen före eller efter IDAT-styckena men aldrig utanför IHDR- och IEND-styckena.

Varje stycke består av 4 fält.[4]

  • Längd: 4 bytes stort positivt heltal som beskriver storleken i byte på datafältet.
  • Stycksetyp: 4 bytes som indikerar vilken styckestyp detta stycke är.
  • Datafält:. Den eventuella datan som stycket innehåller.
  • CRC:. 4 bytes med CRC data beräknad på de föregående fälten.

Kritiska stycken

[redigera | redigera wikitext]

De kritiska styckena är vitala för att överhuvudtaget kunna visa en bild. Alla applikationer som använder PNG måste implementera rutiner för att tolka åtminstone dessa stycken.

Det första stycket i en PNG-dataström. Här finns information om bildens storlek, färgdjup och vilka metoder som använts i de olika kodningsstegen.

IHDR styckestyp i decimal representation.[5]

73 72 68 82

IHDR datafält innehåller följande fält.[6]

  • Bredd: 4 bytes definierar bredden på bilden.
  • Höjd: 4 bytes definierar höjden på bilden.
  • Färgdjup: 1 byte definierar färgdjupet som användes vid kodningen.
  • Färgtyp: 1 byte definierar vilken modell som används för att representation av färgerna. Värdet är summan av de tal som motsvarar de egenskaper som används. Palettbaserad har talet 1, RGB har talet 2 och alfakanal talet 4. Till exempel får en bild med RGB och alfakanal värdet 6. Valet av färgtyp sätter vissa begränsningar angående vilka färgdjup som är tillåtna.
  • Filtreringsmetod: 1 byte definierar vilken metod som användes vid filtreringen.
  • Reduceringsmetod: 1 byte definierar vilken metod som användes vid reduceringen av ursprungsbilden. Giltiga värden är 0 för null-metoden och 1 för Adam7-metoden.

Innehåller den komprimerade bilddatan. En PNG-dataström kan innehålla ett flertal efter varandra följande IDAT-stycken. Storleken på IDAT-styckena är upp till kodaren att avgöra. De kan vara allt från 0 byte och uppåt.

IDAT styckestyp i decimal representation.[7]

73 68 65 84

PLTE-stycket innehåller bildens palett. En palett består av 1–256 färgvärden ordnade från 0 till 255. Dessa färgvärden refereras sedan från en eller flera pixlar i bilden. Varje färgvärde beskriver en färg med 8 bitars djup, detta oavsett vilket färgdjup som användes vid kodningen av bilden.

PLTE-stycket är endast nödvändigt för bilder vars färg beskrivs av en palett men även bilder i RGB kan ha ett PLTE-stycke. För bilder vars färg är beskriven med RGB används PLTE-stycket som ett alternativ för enheter eller applikationer som inte kan visa det stora antal färger som RGB erbjuder.

PLTE styckestyp i decimal representation.[8]

80 76 84 69

Stycke som markerar slutet på en PNG-dataström. Datafältet på IEND-stycket är tomt.

IEND styckestyp i decimal representation.[9]

73 69 78 68

Underordnade stycken

[redigera | redigera wikitext]

De underordnade styckena tillför extra funktionalitet till bilden. Exempel på detta kan vara ICC-profil eller pixlarnas fysiska mått. Det är inte nödvändigt att applikationen som använder PNG skall kunna tolka dessa stycken. Oförmåga att tolka de underordnade styckena kan dock medföra att bilden inte visas som avsett.

  • tRNS: Specificerar en eller flera färger som transparens.
  • cHRM: Bildens krominans och vitbalans.
  • gAMA: Bildens gamma.
  • iCCP: ICC-profil.
  • sBIT: Specificerar antalet signifikanta bitar.
  • sRGB: Indikerar att sRGB används som färgrymd.
  • tEXt: Diverse textvärden, så som titel och skapare.
  • zTXt: Diverse komprimerade textvärden, så som titel och skapare.
  • iTXt: Diverse text kodad med UTF-8.
  • bKGD: Bakgrundsfärg som används vid transparens då ingen lämpligare bakgrundsfärg finns tillgänglig.
  • hIST: Ungefärlig förekomstfrekvens för färgerna i paletten.
  • pHYs: Pixlarnas fysiska mått.
  • sPLT: Alternativ palett, används då inte RGB kan visas.
  • tIME: Tiden då bilden senast ändrats.

Externa länkar

[redigera | redigera wikitext]