png00b.png
Edit v1.000 from 2009-03-16 to 2010-08-11 by TSc+HSc

Portable Network Graphics

PNG steht für Portable Network Graphics und dient als Nachfolgerformat von GIF dem Compuserve Graphics Interchange Format . Dieses Format wurde speziell für das Internet entwicklelt und erlaubt Kompression, sowie Transparenz, bzw. einen eigenen Transparenzkanal. Mit diesem Format kann man Einzellbilder verlustfrei speichern, d.H. egal wie Stark man komprimiert, die Bildinformationen gehen nicht verloren. PNG ist eine sogenannte Rastergrafik, d.h. es wird jeder Pixel des Bildes einzeln gespeichert.

Aufbau

Struktur einer PNG-Datei

Signatur
Chunk 1
...
Chunk n
Abb. 02a: Aufbau einer PNG-Datei

Eine PNG-Datei besteht hauptsächlich aus 2 Komponenten, die Signatur und die Chunks:

  • Die 1. Komponente nennt man Signatur und dient unter hauptsächlich der Identifikation als PNG-Format.
  • Die 2. Komponente nennt man Chunk und in diesen Blöcken werden die Bildinformationen selbst gespeichert. Ein Chunk kann in einer PNG-Datei mehrmals vorkommen, muss aber nicht.

Die Signatur

Byte: 1234 5678
Dezimal: 137807871 13102610
Hexadezimal: 89504E47 0D0A1A0A
ASCII (C): PNG (CR)(LF)(SUB)(LF)
Abb. 03a: Signatur einer PNG-Datei.

Eine PNG-Datei kann anhand der ersten 8 Bytes identifiziert werden. Die Wahl dieser Zeichenfolge hat sogar eine Bedeutung:

  • Das 1. Byte: wurde absichtlich als Nicht-ASCII-Zeichen gewählt, da so verhindert wird, das die PNG als reine Textdatei erkannt wird. Dies betrifft besonderst Betriebssysteme, welche Dateitypen nicht anhand der Dateiendung unterscheiden. (Linux, ...)
  • Das 2., 3. und 4. Byte benennen das Format, also P, N und G.
  • Das 5. und 6. Byte ist Carriage Return und Line Feed, welches unter DOS den Zeilenumbruch darstellt. Wird PNG fälschlicherweise als Text-Daten transportiert, kann es vorkommen das einige Texteditoren/Textbetrachter das Carriage Return wegkürzen und somit die Bilddaten ungültig werden.
  • Das 7. Byte ist die sog. Substitution (Control-Z), sie führt bei DOS zum Abbruch der Ausgabe, sofern DOS die Datei roh ausgeben würde.
  • Das 8. Byte schließt die Signatur ab, in diesem Falle ein einzelnes Line Feed, welches ähnlich wie Byte 5 und 6 die Umwandlung provozieren soll.

Die Chunks

Länge
Typ
Daten
CRC (Prüfsumme)
Abb. 04a: Aufbau eines Chunks

Chunks enthalten sämtliche Informationen, die in einer PNG-Datei gespeichert werden können. Dabei werden unterschiedliche Arten von Informationen auch in unterschiedlichen Chunks mit unterschiedlichen Typen gespeichert. Jeder Chunk besteht aus vier Komponenten.

  • Die Länge definiert, wie lang die reinen Daten sind. (Der Chunk sowie die Zusatzinformationen werden nicht mitgezählt) Die Länge wird in Form eines 4-Byte Integer gespeichert.
  • Der Typ wird ähnlich wie die Länge als 4-Byte Integer gespeichert. Der Typ legt fest, wie die Daten interpretiert werden sollen. Die Byte's des Typ's dürfen nur als Groß- und/oder Kleinbuchstaben gespeichert werden und benennen den Chunk somit zusätzlich (Chunk-Name). Die Groß und Kleischreibung hat zudem noch eine besondere Bedeutung. Bei Groß und Kleinbuchstaben unterscheidet sich nur das 5. Bit pro Zeichen. Diese Unterscheidung wird benutzt, um zusätzliche Informationen direkt im Chunk-Namen zu speichern. So kann pro Zeichen eine Information zusätzlich gespeichert werden:
    Byte Beschreibung
    I ancillary bit (Verzichtbarkeitsbit)
    H private bit (Privatbit)
    D reserved bit (reserviertes Bit)
    R safe-to-copy bit (Kopierbit)
    Abb. 04b: Aufbau des Chunk-Typs
    • Das ancillary bit gibt darüber Auskunft, ob dieses Chunk unverzichtbar ist, oder nicht. Ist das Bit gesetzt, handelt es sich um ein sog. Zusatzchunk. Zusatzchunks können ignoriert werden, wenn sie dem Leseprogramm unbekannt sind. Wenn das Bit nicht gesetzt ist, sind die enthaltenen Daten unverzichtbar für die Darstellung des Bildes notwendig.
    • Das private bit legt fest, ob das Chunk nach Spezifikation aufgebaut ist, oder nicht. Ist das Byte gesetzt, enthält das PNG Chunks, die nicht in der Spezifikation definiert sind. Dieses Bit wird verwendet, um ein Namenskonflikt zwischen spezifizierten Chunks und selbstdefinierten Chunks zu verhindern. PNGs, die vollständig nach Spezifikation verfahren, haben dieses Bit nicht gesetzt.
    • Das reserved bit Ist für spätere Zwecke vorreserviert und hat momentan noch keine Bedeutung. Dieses Bit darf nicht gesetzt sein!
    • Das safe-to-copy bit regelt, ob unbekannte Chunks bei Modifikation des Bildes kopiert werden dürfen oder nicht. Falls ein Programm einen unverzichtbaren Chunk auf irgendeine Weise ändert, dürfen unbekannte Chunks nur kopiert werden, wenn ihr Kopier Bit gesetzt ist. Andernfalls hängen die Daten des unbekannten Chunks von den unverzichtbaren Chunks ab. Bei unverzichtbaren Chunks ist dieses Bit immer gelöscht.

    Ein Kleinbuchstabe signalisiert somit ein gesetztes Bit. Der Großbuchstabe logischweise ein nicht gesetztes Bit.


  • Die eigendlichen Daten, welche je nach Typ kodiert werden.
  • Die CRC (Cyclic Redundancy Check) hat eine Länge von 4 Byte und dient zur Verifikation, ob die Daten korrekt sind, bzw. so erkennen Programme, ob sich ein Chunk verändert hat.

Es gibt mehrere Arten von Chunks. Diese wären:

  • bkGD (= Background Color) Speichert schlicht die Hintergrundfarbe eines Bildes.
  • cHRM (= Primary Chromaticity and Whitepoint) Speichert die CIE-XYZ-Farb-Koordinaten von Rot, Grün und Blau. Diese Informationen dienen zur Korrektur der Phosphorfarben zwischen verschiedenen Monitoren.
  • gAMA (= Image Gamma) Speichert die Gammakurve eines Bildes. Beispielsweise können so teuere Grafiksysteme die Bilder mit angepasster Gammakurve darstellen.
  • hIST (= Image Histogram) Speichert die Häufigkeiten der Farben eines Bildes. Da es Ausgabegeräte gibt, die Bilder nicht in allen Farben darstellen können, muss PNG eine Möglichkeit bieten, die Farben anhand der Häufigkeit zu berechnen. So können die Bilder beispielsweise auf Ausgaben dargestellt werden, die minderer Qualität sind. Zudem muss der PNG-Decoder die Bilddaten selber nicht auslesen, um die Häufigkeit der Farben zu ermitteln.
  • iCCP (= Embedded ICC Profile) Speichtert ICC-Farbprofile zum Bild.
  • IDAT (= Image Data) Enthält die eigendlichen Bilddaten. Die Bilddaten können in mehreren IDAT-Chunks abgelegt werden. Zudem wird Kompression und das sog. Interlacing unterstützt.
  • IEND (= Image Trailer) Definiert das Ende einer PNG-Datei. Alle Daten nach diesem Block werden strikt ignoriert. Das hat vorallem historische Gründe, da einige Übertragungsysteme beim transportieren von Dateien Datenmüll angehangen haben.
  • IHDR (= Image Header) Speichert Informationen, wie Bildbreite, Bildhöhe, Bittiefe, Farbtyp, Kompressionsart, ...
  • iTXt (= International Textual Sata) Ebenfalls ein Textblock, allerdings werden die Daten in UTF-8 (Unicode) gespeichert.
  • pHYs (= Physical Pixel Dimensions) Speichert das natürliche Seitenverhältnis (Aspect Ratio), da beispielsweise Drucker ein anderes Seitenverhältnis verwenden.
  • PLTE (= Palette) Speichert eine Farbpalette zum Bild in einem ähnlichen Format wie GIF-Paletten. In Prinzip eine Liste mit RGB-Bytes. (3 Bytes pro Pixel)
  • sBIT (= Significant Bits) Speichert Anzahl von Bits der Original-Farbdaten. Dient als Zusatzinformation für Decoder, welche das Bild in einer anderen Farbtiefe ausgeben sollen, als das Bild selber gespeichert ist.
  • sPLT (= Suggested Palette) Speichert eine reduzierte Palette als Vorschlag, d.h. wenn die Ausgabe nicht kompatibel ist, wird diese Palette verwendet, wenn auch PLTE nicht vorhanden ist?
  • tEXt (= Textual Data) Speichert Texte, die als Informationen zu den Bild dienen. Dies können Kommentare, sowohl auch Authorenbeschreibungen, usw. sein. Jeder tEXt-Chunk speichert ein Schlüsselbegriff, unter dem die Textdaten erreichbar sind. Der Decoder kann per Frage nach dem Schlüsselbegriff die Textdatern anfordern.
  • tIME (= Image Last-Modification Time) Speichert die letzte Änderung der Datei.
  • tRNs (= Transparency) Speichert Transparenzinformationen zum Bild. Bei Palettenbildern kann jeder Farbe eine Transparenz zugewiesen werden. Graustufen- und Echtfarbbilder speichern nur eine Farbe als transparent markiert.
  • zTXt (= Compressed Textual Data) Wie tEXt, nur werden die Textdaten selbst komprimiert gespeichert.

Kompression

Wie z.B. JPEG benutzt auch PNG Kompressionen. Anderst als wie bei JPEG ist die Kompression nicht verlustbehaftet, d.H. selbst bei der höchsten Kompression, verliert das Bild weder Qualität noch Informationen. Als Kompressionsverfahren wird der Deflations-Algorithmus (ZIP, PKZIP) verwendet. Da dieses Verfahren nicht direkt für 2 dimensionale Daten geeignet ist, werden vor der Kompression spezielle Filter angewendet, die die entgültige Kompression effizienter gestalten. Diese Filter sind eine Ansammlung simpler, sowie komplexer Funktionen und Algorithmen, die das Bild so umrechnen, das es nachhaltig sehr gut mit Deflate komprimiert werden kann.

Interlacing

Auch PNG unterstützt Interlacing. Als Interlacing bezeichnet man ein Speicherverfahren, bei dem ein Bild in mehrere Blöcke unterteilt wird. Beim Lesen der Daten werden somit die größten Blöcke zuerst geladen, es entsteht ein unscharfes Bild. Weiterhin wird eine immer kleinere Variante der Blöcke geladen, das Bild wird immer schärfer. Das geschieht solange, bis das Bild in voller Qualität übertragen wurde. Das Verfahren findet vorallem da Gebrauch, wo das Medium nur sehr langsam ausgelesen werden kann. (z.B. analoge Internetverbindung) So bekommt der Betrachter das Bild kurz nach dem Transfer schon zu sehen, wobei der Effekt eines immer schärfer werdenden Bildes auftritt. Der Vorteil der sich daraus ergibt ist klar. Allerdings müsen zusätzliche Daten gespeichert werden, also eignet sich die Methode nur bei wirklich großen Bildern. Beim Interlacing in PNG wird der sog. Adam7-Algorithmus verwendet.