Dieses Patent führte über 10 Jahre nach seiner Einreichung zur Entwicklung eines neuen Grafikformats.
| 1977 | Abraham Lempel und Jakob Ziv erfinden eine neue Familie von Kompressionsalgorithmen. Die erste Variante wird LZ77 genannt und noch heute in "compress", "zoo", "lha", "pkzip" und "arj" benutzt. Ein Jahr später wird die zweite Variante namens LZ78 erfunden. |
| 1981 | die USA erlauben das Patentieren von Software. |
| 10. August | Lempel, Ziv, Cohn und Eastman patentieren den LZ78-Algorithmus (US patent 4,464,650). |
| 1983 | |
| 1. Juni | IBM reicht ein Patent für LZW-Kompression ein (US 4,814,746) |
| 20 Juni | Terry A. Welch patentiert für die Sperry Corporation (später von Unisys aufgekauft) als "High speed data compression and decompression apparatus and method" den LZW-Algorithmus (eine modifizierte Variante des LZ78) noch einmal in spezieller Form (siehe Bild). Aber das Patentamt erkennt die Überschneidung nicht und vergibt ein weiteres Patent (US patent 4,558,302, EP 0,129,439). |
| 1984 | der erste Artikel über LZW erscheint in einer Fachzeitschrift. Es gibt in den USA keine Veröffentlichungspflicht für Patente. |
| 1987 | CompuServe veröffentlicht GIF als freie und offene Spezifikation. |
| 1987-1994 | GIF wird rasch ein sehr beliebtes Dateiformat um Bilder zu speichern und auszutauschen. |
| 1990 | E. Fiala und D. Greene erhalten das Patent Nr. US 4,906,991 für eine Variante von LZ77 mit einem Wörterbuch in Baumstruktur. |
| 1991 | IBM erhält Patent Nr. US 5,001,478 für einen Algorithmus, der die "LZ77-history" mit dem "LZ78-lexicon buffer" kombiniert. |
| Phil Katz (Programmierer von "pkzip") erhält Patent US 5,051,745 für eine LZ77-Variante, die mit sortierten Streutabellen arbeitet, wenn die Tabellen kleiner als die Fenstergrösse sind. | |
| Weitere Patente für LZ77-Varianten mit Streutabellen gingen an Robert Jung (Programmierer von "arj") (Patent 5,140,321), Chambers (Patent 5,155,484) und Stac, Inc. (Patent 5,016,009). | |
| Weitere Varianten von LZ77 und LZW wurden entwickelt, aber nicht patentiert. | |
| 1993 | Unisys merkt, daß GIF ihr LZW-Patent berührt und informiert CompuServe. |
| 1994, 29. Dezember | Unisys tritt mit Gebührenforderungen an die Öffentlichkeit. Bis dahin beschränkte sich Unisys auf Hardware, die den LZW-Algorithmus verwendet, z.B. Modems mit V.42. |
| 1995, 4. Januar | Thomas Boutell sendet die Spezifikation für ein "Portable Bitmap Format" (PBF) in zahlreiche Diskussionsforen im globalen Datennetz ("news-groups"). Eine bunte Schar Entwickler aus der ganzen Welt bildet per Epost und Diskussionsforen die PNG-Gruppe. Ihr Ziel: Ein neues Grafikformat, frei von geschützten Algorithmen und den besonderen Anforderungen der Datennetze gewachsen. Nach kurzer Diskussion steht fest, das die Zeit reif ist für ein komplett neues Format und daß Erweiterungen bestehender Formate, etwa GIF24, transparente JPEG (Joint Photographic Expert Group, siehe Vortrag 11), TIFF-Untermengen (Tagged Image File Format) oder ähnliches nicht allen Anforderungen gerecht werden würden. |
| 1995 | |
| 6. Januar | Oliver Fromme erfindet den Name "PNG". Intern steht es für "PiNG is Not GIF". Die Aussprache von PNG als "ping" steht jetzt sogar in der offiziellen Spezifikation. [5] |
| 15. Januar | Die dritte Version der PNG-Spezifikation wird veröffentlicht. Deflate-Kompression, Gamma-Information, zyklische Prüfsummen, 16 Bit Farbtiefe und Alpha-Kanal sind bereits enthalten. Erste Implementierungen zeigen eine 10% bessere Kompression gegenüber GIF. |
| 16. Januar | CompuServe kündigt das GIF24-Projekt an. Weitere PNG-Spezifikationen erscheinen in rascher Folge. |
| 7. Februar | CompuServe kündigt volle Unterstützung für PNG an. |
| 7. März | Die allerersten PNG-Bilder werden ins Netz gestellt. |
| 24. März | Die allererste Version 0.1alpha der "pnglib" erscheint. |
| 1. Mai | Zusammen mit "pnglib" 0.6beta erscheint die erste "zlib" 0.9beta. Die "zlib" ist eine freie, portable Bibliothek für den Umgang mit dem "zlib"-Format. Diese beiden Bibliotheken sind gerade stabil genug um benutzt zu werden. Mit ihrer Hilfe gibt es kurz darauf bereits die ersten PNG-Implementierungen. |
| 13. Juni | Eine PNG Heimatseite wird ins Netz gestellt. |
| 25. Juni | Glenn Randers-Pehrson veröffentlicht Version 1 der PNF ("Portable Network Frame")-Spezifikation als Ergänzung zu PNG. Der Aufbau ist stark an PNG angelehnt, speichert jedoch mehrere Bilder in einer Datei. Die integrierten Animationsfähigkeiten gehen weit über die von GIF hinaus (z.B. "Sprite"-Animationen). Später wird das Format in MNG ("Multiple Network Graphics") umbenannt. |
| Oktober | Die ersten Betaversionen von Netscapes Navigator erscheinen zur Bestürzung der PNG-Gruppe mit Unterstützung von animierten GIFs. |
| 8. Dezember | Das World Wide Web Consortium (W3C) veröffentlicht die PNG-Spezifikation 0.92 als offizielles Arbeitsdokument. |
| 1996 | |
| 23. Februar | Die PNG-Spezifikation 0.95 wird als "Internet Draft" von der Internet Engineering Task Force (IETF, siehe: http://www.ietf.org/ ) vorgestellt. |
| 21. Mai | "zlib" 1.0.1, die erste nicht-beta erscheint |
| 22. Mai | Die Spezifikationen der zlib, des "Deflate"-Algorithmus und von "gzip" erscheinen als offizielles RFC ("request for comments") unter den Nummern 1950 [9], 1951 [10] und 1952. |
| 30. Mai | Tom Lane, der letzte Überarbeiter den PNG Spezifikation, erklärt PNG für abgeschlossen und die Version 0.98 als offizielle 1.0 unter dem Vorbehalt der media/png-Registratur. |
| 1. Juli | Das W3C stellt die PNG-Spezifikation auf offiziellen "Proposed Recommendation"-Status. |
| 11. Juli | Die Internet Engineering Steering Group (IESG) akzeptiert die PNG Spezifikation 1.0 als offizielles Informational RFC |
| 4. August | Die Virtual Reality Modeling Language (VRML) 2.0 Spezifikation wird veröffentlicht. PNG und JPG sind die beiden internen Bildformate, die unterstützt werden müssen. |
| 1. Oktober | PNG wird vom W3C offiziell als "Recommendation" in einer Presseerklärung genannt. |
| 14. Oktober | Die Internet Assigned Numbers Authority (IANA, http://www.iana.org/ ) akzeptiert image/png formal als "Internet Media Type". |
| 31. Dezember | Die MNG Spezifikation erscheint in der 30. Version. |
| 1997 | |
| 15. Januar | Die IETF veröffentlicht die PNG Spezifikation 1.0 als offizielles RFC 2083 (siehe: ftp://ftp.isi.edu/in-notes/rfc2083.txt ) |
| 3. April | Xara Inc. veröffentlicht die Flare 1.0 Spezifikation. Die ist ein Vektorgrafikformat, ähnlich PNG. Es kann Bitmaps als PNG enthalten. |
| 14. März | Die National Gallery of Art in Washington D.C. stellt ihre Heimatseite komplett auf PNG um. |
| 11. November | "Netscape 4.04" wird mit PNG-Fähigkeiten (alllerdings ohne Alpha-Kanal) veröffentlicht. Zusammen mit dem wenige Wochen vorher veröffentlichten "Internet Explorer 4.0" sind jetzt 90% aller benutzen Stöberer PNG-fähig. |
| 31. Dezember | Die MNG Spezifikation erscheint in der 42. Version. |
| 1998 | |
| 7. März | "libpng" 1.00 erscheint fast auf die Minute genau drei Jahre nachdem die PNG Spezifikation, 9. Version veröffentlicht wurde. |
| 8. April | Netscape entfernt den PNG-schreibenden Code aus Mozilla. Stac Inc. hatte Patentansprüche auf den "Deflate"-Algorithmus beansprucht unter Berufung auf die Patente (US 4,701,745 und US 5,016,009). Die Free Software Foundation hatte bei Patentrecherchen nichts gefunden. Mitglieder der PNG-Gruppe halten diesen Vorfall für ein Mißverständnis zwischen Netscape und Stac Inc. bei Patentproblemen bei SSL-Verschlüsselung. |
| 9. Juli | "zlib" 1.1.3 erscheint |
| 23. August | Eine MNG-Heimatseite wird ins Netz gestellt (siehe: http://www.cdrom.com/pub/mng/
)
Technische Informationen (siehe: http://www.cdrom.com/pub/mng/mngdocs.html ) |
| 31. Dezember | PNG Spezifikation 1.1 erscheint. Zusätzlich erscheint ein
eigenes Dokument, welches die Erweiterungsblöcke näher beschreibt.
Überarbeitet wurden die Blöcke sRGB (standard sRGB color space) [16], iCCP (International Color Consortium profile) [15], sPLT (suggested palette and histogram). |
| 1999 | |
| 9. Januar | Ein ISO PNG Treffen findet in San Jose statt. Zu Beginn des Jahres könnte die jetzige Spezifikation 1.1. zum offiziellen Standard ISO/IEC (International Electrotechnical Commission) 15948 werden. |
| 14. Januar | "pnglib" 1.0.3 erscheint. |
| 2003 | Das GIF-Patent von Unisys läuft aus... :-) |
Beispiel:
Dieses Bild hat starke Treppentstufen-Effekte...
Bild 2: Ohne Kantenglättung
..also wird es auf weißem Hintergrund verwischt...
...was zu häßlichen weißen Rändern führt,
wenn das Bild auf einem anderen Hintergrund dargestellt wird. Das Problem
liegt in der binären Transparenz von GIF. Einzige Abhilfe: Echte Alphakanäle,
wie sie PNG bietet. Damit wird kein Verlauf mehr von der Bildfarbe zum
Hintergrund erzeugt, sondern ein Verlauf von der Bildfarbe zu immer höherer
Transparenz. Das PNG mit Alpha-Kanal sieht dann weich aus wie Bild 3, nur
eben vor jeder Hintergrundfarbe.
Bild 4: störende weiße Ränder
Für Alphakanäle gibt es zwei Verfahren. Bei "vorabmultipliziertem
Alpha-Kanal" ("premultiplied alpha") wird jeder Pixel mit seiner Transparenz
vor einem schwarzen Hintergrund verrechnet. Ist der Alpha-Wert jedoch null,
also voll transparent, gehen die Farbinformationen des Pixels verloren,
da sich diese nun ebenfalls zu null ergeben.
Bei "nichtverknüpften" ("unassociated") Alpha-Werten werden die
Alpha-Werte erst beim dekodierendes Bildes eingerechnet. Diese etwas flexiblere
Methode erlaubt eine von den Pixelfarben unabhängige Bearbeitung der
Alpha-Maske ohne Verlust von Bildinformationen. Daher hat sich die PNG-Gruppe
für diese Variante entschieden. [11]
Ein Test mit PNG-Bildern, die Alpha-Kanal-Informationen enthalten, ist
zu finden unter:
http://www.w3.org/Graphics/PNG/inline-alpha.html
Bild 5: Adam7, erster Durchgang
Im nächsten Schritt wird das Bild in gedachte 32 x 64 - Blöcke
aufgeteilt. Jede zweite linke obere Ecke wurde schon übertragen, die
jeweils fehlende wird nun im Datenstrom übertragen. Diese Iteration
erfolgt jetzt nicht nur von links nach rechts, sondern auch in der anderen
Bilddimension, von oben nach unten. Nun ist die Symmetrie wieder hergestellt
und von jedem 32x32-Block die linke obere Ecke übertragen worden.

Bild 6 & 7: Adam7, zweiter und dritter Durchgang
Die Iteration läuft ein weiteres Mal ab. Jetzt sind erst 25% der
Bildinformationen übertragen worden.

Bild 7 & 8: Adam7, vierter und fünfter Durchgang
Nach dem siebten Schritt ist das Bild vollständig übertragen
worden. Nach seinem Erfinder Adam M. Costello heißt es Adam7. Herr
Costello hat dieses Verschachtelungsschema nicht patentieren lassen, dieses
aber nach eigenen Angaben auch nicht vor.

Bild 9 & 10: Adam7, sechster und siebter Durchgang
Im ersten Schritt werden die Bildpunkte nach dem gewählten Verschachtelungsschema vertauscht. Wird die Adam7-Verschachtelung gewählt, so führt dies zu etwa 20% größeren Bildern (eigene Berechnungen).
Im zweiten Schritt werden verschiedene verlustfreie Filter angewandt um die Daten besser komprimierbar zu machen.
Im dritten Schritt wird der verschachtelte, gefilterte und komprimierte Datenstrom in einen oder mehrere Datenblöcke geschrieben.
Der zlib-Datenstrom hat folgenden Aufbau [9]:
Kompressionsmethode: 1 Byte
zusätzliche Steuerbits, Prüfbits: 1 Byte
komprimierte Datenblöcke: n Bytes
Prüfsumme: 4 BytesFür Verwendung in PNG muß die einzig spezifizierte Kompressionsmethode 0 ("zlib"-Format) gewählt werden. Im "zlib"-Datenstrom muss als Subformat Methode 8 ("Deflate"-Kompression) gewählt werden. Außerdem darf das Schiebefenster nicht größer als 32 KB sein. Auch ein vorab gesetztes Wörterbuch darf nach PNG-Spezifikation nicht definiert werden.
Die Filtermethode kann von Zeile zu Zeile wechseln. Ein jeder Zeile vorangestellter Filtertypindikator, ein Byte mit einem Wert zwischen 0 und 4, zeigt die für diese Zeile gültige Art der Filterung an. Sind die Daten verschachtelt angeordnet, ist jeder Durchgang wie ein unabhängiges Bild zu behandeln. Die Vorgängerzeile ist in jedem Fall die zuvor übertragene Zeile, also nicht notwendigerweise die im Bild benachbarte. Dieses Vorgehen gewährleistet die Möglichkeit der kontinuierlichen Dekodierung während der Datenübertragung. Zu beachten ist, das Filter immer auf den Bytes der Bildzeilen arbeiten, egal welche Informationen diese gerade tragen. So werden beispielsweise Alpha-Werte einfach mitgefiltert.
Für Bilder vom Datentyp 3, das heißt für 256farbige Palettenbilder, ist Filterung in der Regel ineffektiv. Die Autoren empfehlen hier den Filtertyp 0. Keine Filterung empfiehlt sich auch bei Farbtiefen kleiner als 8 Bit. Aufgrund des kleinen Wertebereichs ist der Gewinn gering. Ein Dekoder mit fest eingestelltem Filtertyp sollte den Paeth-Filter (nach Alan W. Paeth) verwenden. Er ist im allgemeinen am effektivsten. Dekoder, die den Filtertyp von Zeile zu Zeile wechseln, können folgendes Verfahren für die Auswahl des effizientesten Filters wählen: Jede Zeile wird auf alle fünf Arten gefiltert. Als günstigste Filterung gilt diejenige, bei der die Summe aller Werte in der Ausgabezeile am kleinsten ist. Die Kombination von Filterung und LZ77 führt gegenüber GIF zu 10 bis 30 Prozent besseren Kompressionsergebnissen. [7]
Allgemein sieht ein Filter so aus:
Filter(x) = Ungefiltert(x) - Prognose(x) vorzeichenlos arithmetisch modulo 256das bedeutet nichts anderes, als daß das Ergebnis durch Addition/Subtraktion in den Bereich von 0-255 verschoben wird.
Hier nun die Filter im Detail:
Filter die sich auf Bytes links von der aktuellen Position beziehen müssen diese als null ansehen. Anlog für Reihen.
255 253 250 247 244 240 237 233 230 227 223 220 etc.der Sub-Filter würde daraus folgendes machen:
255 2 3 3 3 4 3 4 3 3 4 3 etc.Diese Bytes wurden ohne Datenverlust erzeugt und können wesentlich besser komprimiert werden, da weniger verschiedene Werte vorkommen.
Filteralgorithmen zur Kompression sind noch nicht gut erforscht worden,
es ist also gut möglich das noch bessere Filter gefunden werden, welche
die Kompression weiter verbessern. Diese werden unter einer anderen Filtersetnummer
spezifiziert werden, so daß es nicht passieren kann, daß ein
Dekoder ein Bild entpackt und dann merkt, daß es ihm unbekannte Filter
enthält.
|
PNG-Datei |
|
| Signatur
|
Blöcke |
Jede PNG-Datei beginnt mit einer kurzen Signatur gefolgt von Datenblöcken. Die Dateierweiterung lautet stets ".PNG".
|
Signatur, 8 Bytes |
|||||||
| BYTE | BYTE | BYTE | BYTE | BYTE | BYTE | BYTE | BYTE |
| 89h
|
50h | 4Eh | 47h | 0Dh | 0Ah | 1Ah | 0Ah |
| Test auf 8-Bit-Transfer | "P" | "N" | "G" | Carriage Return (CR) = Wagenrücklaufsymbol | Line Feed (LF) = Zeilenvorschubsymbol | Ctrl-Z, stoppt Ausgabe unter DOS | Line Feed |
Die "magische" Signatur besteht aus acht Bytes. Das erste Byte prüft, ob das PNG durch ein 8-Bit-fähiges Datennetz geschickt wurde. Wenn nicht, so ist dieses Byte bereits falsch. Die nächsten drei Bytes kennzeichnen den Dateityp "PNG". Das fünfte und sechste Byte prüfen ob beim Übertragen eines der beteiligten Betriebssysteme die Sequenz "CR LF" interpretiert und verändert hat, das könnte zum Beispiel der Fall sein, wenn das PNG als Text oder ASCII verschickt wurde. In diesem Fall ist ein Fehler zu melden, da diese Bytes durchaus in anderen Blöcken als Datenbytes vorkommen können und keinesfalls verändert werden dürfen. Sollte die PNG-Datei versehentlich in eine DOS-Ausgabe (z.B. "type xyz.png") geraten sein, so stoppt Byte 7 diese Ausgabe. Das letzte Byte testet analog zum vierten/fünften ob auch einzelne LF-Zeichen ohne Veränderungen verschickt werden.
| Start
|
Zusatz-
blöcke, evtl. Palette |
Bilddaten | ... | Bilddaten | Zusatz-
blöcke |
Ende |
|
Blockgrundaufbau |
|||||||||
| DWORD | DWORD | BYTE | BYTE | ... | BYTE | DWORD | |||
| DataLength
|
Type | Data[0] | Data[1] | ... | Data[n] | Crc | |||
| Längen-
angabe |
Block-Typ | Block-Daten | Block-Daten | ... | Block-Daten | CRC-32 über
Typ und Daten |
|||
Jeder Block beginnt mit einer Angabe der Anzahl der Datenbytes, Längenangabe,
Blocktyp und CRC-32 nicht mitgerechnet. Obwohl dieser Wert einen vorzeichenlosen
Integer darstellt, sollten En-/Dekoder keine Werte größer als
(231)-1 Bytes zulassen, da viele Programmiersprachen so große
vorzeichenlose Integer nicht bereitstellen und PNG-Programme daher unnötig
schwer zu implementieren wären.
Als nächstes folgt die vier Byte lange Typkennung. Durch die Längenangabe
können unbekannte Blöcke gezielt übersprungen werden.
Jetzt folgen die eigentlichen Datenbytes, gefolgt von einer Prüfsumme,
die sich über Typkennung und Datenbytes erstreckt. Die Länge
wird nicht mit in die CRC-Berechnung einbezogen, damit ein Durchgang (Erzeugen
der Datenbytes und berechnen der Prüfsumme) ausreicht.
Das verwendete CRC-Polynom lautet:
x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1(siehe Vortrag 4)
| Kürzel | Name, Position | Daten-
bytes |
Bedeutung | Vorteil | ||
|---|---|---|---|---|---|---|
| IHDR | Image header, Anfang | 13 | Start-Block, elementare Bildparameter | Größe beim Laden sofort bekannt | ||
| sBIT | Significant bits, IHDR-PLTE | 1 - 4 | Bittiefe des Bildes vor dem Speichern als PNG | Bessere Darstellung falls nur geringe Bittiefe auf Plattform | ||
| gAMA | Image gamma, IHDR-PLTE | 4 | Helligkeitswerte beim Erstellen: Beleuchtung, Bildschrim, usw.. | Plattformunabhängige Darstellung, Helligkeit wird viel exakter angezeigt | ||
| cHRM | Primary chromaticities and white point, IHDR-PLTE | 32 | Spezifiziert die RGB-Grundfarben nach 1931 CIE x,y - Standard | Plattformunabhängige Darstellung, Farben werden exakter angezeigt | ||
| PLTE | Palette, IHDR-IDAT | 3 - 768 | RGB - Palette, benötigt und erlaubt je nach Farbtyp | GIF kann leicht als PNG konvertiert werden | ||
| hIST* | Image histogram, PLTE-IDAT
*nur wenn PLTE-Block |
2 - 512 | Häufigkeit der vorkommenden Farben, 2 Byte pro Paletteneintrag | optimierte Darstellung falls weniger Farben darstellbar als im Bild | ||
| bKGD | Background color, PLTE-IDAT | 1 - 6 | Hintergrundfarbe: Paletteneintrag, Graustufenwert oder RGB-Definition | spart Platz, schnell sehr gute Vorschau | ||
| tRNS | Transparency, PLTE-IDAT | 1 - 256 | Alphawerte anlog GIF: für einzelne Farben/Paletteneinträge | GIF kann besser konvertiert werden, geringer Platzbedarf | ||
| pHYS | Physical pixel dimensions, IHDR-IDAT | 9 | Physikalische Grösse der Pixel und/oder Länge/Breite-Verhältnis | korrekte Geometrie auch bei Anzeige mit rechteckigen Pixeln | ||
| oFFs | Image offset, IHDR-IDAT | 9 | Position beim Drucken oder auf grossem Bildschirm | |||
| pCAL | Calibration of pixel values, IHDR-IDAT | 16 -max | Relation zwischen Pixelwerten und physikalischen Messwerten | Kalibrierungsbalken kann angezeigt werden | ||
| sCAL | Physical scale of image subject, IHDR-IDAT | 4 - max | Grösse des abgebildeten Objekts für Berechnungen | Verwendung bei Strassenkarten, Astronomie, Medizin | ||
| tIME | Image last-modification time, IHDR-IEND | 7 | Zeitmarke der letzten Bearbeitung | Jahr-2000-fähig | ||
| tEXt | Textual data, IHDR-IEND | 3 - max | unkomprimierter Text: (Schlüsselwort, 00-Byte, Text) | Informationen über: Autor, Software, rechtliche Hinweise... | * | |
| zTXt | Compressed textual data, IHDR-IEND | 3 - max | komprimierter Text analog tEXT, verwenden ab 1KB | lange Texte werden komprimiert übertragen | * | |
| gIFg | GIF Graphic Control Extension, IHDR-IEND | 4 | GIF-Kontrollwerte | alle GIF-Informationen können im PNG gespeichert werden | * | |
| gIFx | GIF Application Extension, IHDR-IEND | 4 - max | GIF-Erweiterungsblöcke | alle GIF-Informationen können im PNG gespeichert werden | * | |
| IDAT | Image data, IDHR-IEND | 0 - max | nach Vorgaben angeordneter und komprimierter Datenstrom | klein, schnelle Vorschau | * | |
| IDAT* | *folgende IDAT-Blöcke müssen aufeindander ohne Unterbrechung folgen | |||||
| IDAT | ||||||
| IEND | Image trailer, Ende | 0 | End-Block, Dateiende-Markierung |
Lesart:
Fettgedruckte Blöcke sind "kritische Blöcke", Dekoder und
Enkoder müssen sie beherrschen. Blöcke mit * hinten dürfen
beliebig oft vorkommen. Die Länge der Balken gibt optisch an, wo sich
die Blöcke befinden dürfen (wird beim Ausdrucken dieses Dokuments
leider oft abgeschnitten). Der gAMA-Block z.B. kann nicht vor den Anfang,
aber auch nicht hinter den PLTE-Block rutschen. Ob erst gAMA dann
cHRM oder umgekehrt kommt, ist jedoch egal. Die maximale Länge eines
Blocks ist 231-1.
Ein gutes Beispiel ist die Anwendung von PNG im medizinischen Bereich, z.B. in einem Krankenhaus. Hier könnte zu jeder Röntgenaufnahme ein Block definiert werden, der Angaben über
|
Start-Block, IHDR (Image Header) |
||||||||||||||
| DWORD | DWORD | DWORD | DWORD | BYTE | BYTE | BYTE | BYTE | BYTE | DWORD | |||||
| DataLength
|
Type | Crc | ||||||||||||
| Längen-
angabe |
Block-
Typ |
Breite | Höhe | Bit-
Tiefe |
Farb-
typ |
Kompres-
sion |
Filter | Verschach-
telung |
CRC-32 über
Typ und Daten |
|||||
Dieser Block muß am Anfang (nach der Signatur) stehen und darf
nur einmal vorkommen. Hier werden elementare Bildparameter angegeben.
Breite und Höhe werden in Pixeln angegeben. Die Bittiefe gibt
die Länge der Bitmuster im IDAT-Block an. Bitmuster können
sowohl Farbwerte (RGB), Graustufen, Alpha-Werte als auch Paletteneinträge
bedeuten je nach Farbtyp. Des weiteren enthält der Start-Block Angaben
über die verwendete Kompression, benutzte Filter sowie das Verschachtelungs-Schema.
Farbtyp, gesetzte Bits bezeichen:
Bit 1 Bild mit Palette
Bit 2 Farbe wird statt Graustufen benutzt
Bit 3 Alpha-Kanal wird benutzt.Desweiteren wird im Start-Block ein Byte für die Länge jedes Bitmusters übertragen. Diese Muster, welche entweder einen Graustufenwert, einen Rot-, Grün-, Blauwert oder einen Paletteneintrag bezeichnen, dürfen 1, 2, 4, 8 und 16 Bit lang sein. So können bei kleinen Bitlängen immer mehrere Muster in einem Byte übertragen werden, ohne komplizierte Umrechnungen zu erfordern, da Muster nie über Bytegrenzen hinaus ragen können.
| Farbtyp | Palette? | Farbe? | Alpha- Kanal? | erlaubte Bittiefen | Jedes Bitmuster ist... |
| 0 | - | - | - | 1, 2, 4, 8, 16 | ...ein Graustufenwert |
| 2 | - | ja | - | 8 oder 16 | ...ein RGB-Triplett |
| 3 | ja | ja | - | 1, 2, 4 oder 8 | ...ein Paletteneintrag. Ein PLTE-Block wird erwartet. Die Bittiefe gibt hierbei nicht die Genauigkeit der Farben an, nur die Länge eines Paletteneintragwertes. |
| 4 | - | - | ja | 8 oder 16 | ...ein Graustufenwert gefolgt von einem Alpha-Wert |
| 6 | - | ja | ja | 8 oder 16 | ...ein RGB-Triplett, gefolgt von einem Alpha-Wert |
Paletteneinträge sind immer entweder 8-Bit-Graustufen oder 24-Bit RGB-Triple.
Enkoder müssen Bilder mit Bittiefen die im gewählten Farbtyp nicht erlaubt sind in eine erlaubte Bittiefe umrechnen. Üblicherweise werden die Muster dafür in der nächsthöheren erlaubten Bitlänge gespeichert. Dabei werden die originalen Bits als höherwertige Bits gespeichert. Die niederwertigen Bits können mit verschiedenen Methoden aufgefüllt werden. Die originale Bittiefe sollte in einem sBIT-Block gespeichert werden.
Die Spezifikation definiert dabei für Kompression
0 = "Deflate"-AlgortihmusFilter
0 = Filterset nach Spezifikation verwendetVerschachtelung
0 = keine
1 = Adam-7-Verschachtelung
|
Paletten-Block, PLTE (Palette) 1 bis 256 Einträge.... |
|||||||||
| DWORD | DWORD | BYTE | BYTE | BYTE | ... | DWORD | |||
| DataLength
|
Type | Red | Green | Blue | R | G | B | Crc | |
| 0 = Schwarz | 0 = Schwarz | 0 = Schwarz | |||||||
| Längen-
angabe |
Block-Typ | 255 = Rot | 255 = Grün | 255 = Blau | CRC-32 | ||||
Bei indizierten Bildern (Farbtyp 3) muß ein Palettenblock vorkommen.
Die Längenangabe muß durch 3 teilbar sein (es gibt keine Graustufenpaletten),
sonst muß ein Fehler gemeldet werden. Die Daten des Palettenblocks
kennzeichnen als RGB-Tupel die Farbwerte für die einzelnen Palettenfarbe,
beginnen bei Farbe 0. Es müssen alle im Bild vorkommenden Farben definiert
werden, es dürfen auch noch weitere, unbenutzte Farben definiert werden.
Bei Bildern anderer Farbtypen gibt die Palette laut Spezifikation an,
auf welche Farben das Bild reduziert werden soll, falls die anzeigenden
Systeme nicht alle Farben darstellen können. Es darf nur ein Palettenblock
vorkommen.
|
Daten-Block, IDAT (Image Data) |
|||||||
|---|---|---|---|---|---|---|---|
| DWORD | DWORD | BYTE | BYTE | BYTE | ... | BYTE | DWORD |
| DataLength
|
Type | verschachtelter und komprimierter Datenstrom der Bildpunkte... | Crc | ||||
| Längen-
angabe |
Block-Typ | CRC-32 über
Typ und Daten |
|||||
Der Bilddatenblock ist der Kern der PNG-Spezifikation. Hier werden nun
die wirklichen Pixel übertragen.
Vom Konzept her ist ein PNG Bild immer ein rechteckiges Pixel-Datenfeld.
Pixel werden in Bildzeilen von links nach rechts übertragen, Bildzeilen
von oben nach unten. Die Größe jedes Pixels ist durch die Bittiefe
im Startblock angegeben.
Bei indizierten Bildern ist jeder Pixel der Verweis auf einen Paletteneintrag
der vorab mitgeschickten Palette. Die Bittiefe gibt hier die maximale Farbanzahl
der Palette, nicht die Farbtiefe innerhalb der Palette an.
Graustufenbilder bestehen nur aus einem Wert pro Pixel. Null steht
für Schwarz und der größte Wert der gegeben Bittiefe repräsentiert
Weiß.
Ein "Truecolor" Pixel besteht aus drei Werten: Rot, Grün und Blau.
Null ist jeweils schwarz, der größte Wert die angegebene Farbe.
Die Bittiefe bestimmt die Genauigkeit der Komponenten, nicht des gesamten
Pixels. Graustufen- und Farbpixel können zusätzlich noch einen
Alpha-Wert der gleichen Bittiefe enthalten.
Pixel werden immer in Bildzeilen gepackt, ohne Pixel zu verschwenden.
Bei Bittiefe 2 etwa werden je 4 Pixel in einem Byte übertragen. Pixel
mit einer kürzeren Bittiefe als acht ragen nie über die Bytegrenzen
hinaus. Die Pixel, die am weitesten links stehen kommen in die höchstwertigsten
Bits des Trägerbytes. Die Länge der Bildzeilen steht wegen Wahl
der Bilddimensionen und des Verschachtelungs-Schema vorab fest.
Sollen z.B. 11 4-Bit-Pixel übertragen werden, so werden die ersten
10 Pixel in 5 Bytes übertragen, der letzte Pixel wird in den höchstwertigsten
Bits des sechsten Bytes übertragen. Die niederwertigen Bits werden
verschwendet und bleiben unspezifiziert.
Beim Komprimieren wird vor jeder Bildzeile ein Byte für den Filtertyp
gehängt. Dieser Datenstrom wird im "zlib"-Format auf einen oder mehrere
IDAT-Blöcke
verteilt. IDAT-Blöcke müssen ohne Unterbrechung durch
andere Blocktypen aufeinander folgen. Selbst Prüfsummen oder andere
Steuerdaten können auf mehrere IDAT-Blöcke verteilt
sein. Der verwendete Kompressionsalgorithmus wird im Start-Block angegeben
werden. PNG spezifiziert derzeit nur den Wert 0 für "zlib"-Kompression.
|
Ende-Block, IEND (Image trailer) |
||
|---|---|---|
| DWORD | DWORD | DWORD |
| DataLength
|
Type | Crc |
| Längen-
angabe |
Block-Typ | CRC-32 über
Typ und Daten |
Der Ende-Block darf nur einmal vorkommen und enthält keine Daten. Er muß am Ende der PNG-Datei stehen. Alle weiteren Daten werden ignoriert.
Ein Test mit PNG-Bildern, die Gamma-Informationen enthalten, ist zu
finden unter:
http://www.w3.org/Graphics/PNG/all_seven.html
Blöcke, die nach der Palette stehen müssen, falls eine vorhanden ist.
Blöcke, die vor den IDAT-Blöcken stehen müssen
Blöcke, die überall stehen dürfen
Zusatz-Bit (Bit 5 des ersten Bytes)
0 (Großbuchstabe) = kritischer Block
1 (Kleinbuchstabe) = zusätzlicher Block
Zusätzliche Blöcke können ohne weiteres ignoriert werden.
Einfache Dekoder können so jedes Bild korrekt anzeigen, ohne viele
Blöcke zu kennen.
Privates Bit (Bit 5 des zweiten Bytes)
0 (Großbuchstabe) = öffentlicher Block nach PNG-Spezifikation
1 (Kleinbuchstabe) = privater Block
Dieses Bit muß nicht abgefragt werden, verhindert aber, daß
private Blöcke den gleichen Namen wie aktuelle oder zukünftige
öffentliche Blöcke erhalten können.
Reserviertes Bit (Bit 5 des dritten Bytes)
0 (Großbuchstabe) = konform zur PNG-Spezifikation
Dieses Bit hat noch keine spezielle Funktion, bleibt aber für
Erweiterungen nutzbar. Dekoder müssen auch PNGs mit gesetztem "Reservierten
Bit" anzeigen können, da zukünftige PNG-Erweiterungen dies evtl.
spezifizieren.
"Kopieren erlaubt"-Bit (Bit 5 des vierten Bytes)
0 (Großbuchstabe) = Block darf nicht einfach kopiert werden,
er hängt von kritischen Blöcken ab, z.B. hIST
1 (Kleinbuchstabe) = Block darf einfach kopiert werden, z.B.
tEXt
Dieses Bit ist für PNG-Editoren gedacht: Sie können so jede
PNG-Datei lesen und pro Block entscheiden was zu tun ist: Ist das "Kopieren
erlaubt"-Bit gesetzt, so kann der Block in jedem Fall einfach ohne Veränderungen
in die Zieldatei geschrieben werden. Ist das Bit nicht gesetzt, so hängt
der Inhalt von den Bilddaten (kritischen Blöcken) ab. Entweder der
Editor errechnet diesen Block korrekt, da er ihn erkannt hat, oder er läßt
ihn ganz aus.
Dieses Bit sollte für kritische Blöcke immer ungesetzt sein.
bLOb <-- 32 Bit Block-Typkode als ASCII-Text
||||
|||+- "Kopieren-Erlaubt"-Bit gesetzt (Kleinbuchstabe;
Bit 5 = 1)
||+-- Reserviertes Bit nicht gesetzt (Großbuchstabe;
Bit 5 = 0)
|+--- Privates Bit nicht gesetzt
(Großbuchstabe; Bit 5 = 0)
+---- Zusatz-Bit gesetzt
(Kleinbuchstabe; Bit 5 = 1)
Dieser Block wäre demnach ein PNG-spezifizierter Zusatz-Block der einfach kopiert werden darf.
Die Block-Namens-Konvention erlaubt eine flexible Erweiterung des PNG-Formats.
Selbst die wildesten Erweiterungen führen nur dazu, daß sich
im schlimmsten Fall für den En-/Dekoder unbekannte Blöcke in
der Datei befinden. Sind sie als zusätzlich markiert kann das Bild
trotzdem korrekt angezeigt werden. PNG verwendet keine Versionsnummern,
da sie oft dazu führen, das z.B. Betrachtungsprogramme das Anzeigen
einer Datei mit zu hoher Versionsnummer verweigern (z.B. bei GIF als 89a
eingeführt wurde). Bei PNG müssen Dekoder nur prüfen ob
sie fähig sind, alle wichtigen (kritischen) Blöcke auszuwerten.
Das genügt dann völlig um das Bild rudimentär anzuzeigen.
Zusatzblöcke können nicht von anderen Zusatzblöcken
sondern immer nur von kritischen Blöcken abhängen. Ist es dennoch
unvermeidbar z.B. bLOb von tEXt abhängig zu machen, so speichert man
einfach die CRC-Prüfsumme des tEXt-Blockes im bLOb-Block. So können
Editoren auswerten, ob tEXt unverändert geblieben ist, bzw. ob bLOb
noch korrekt von tEXt abhängt.
|
|
|
|
|
|
|
|
| Netzgrafik | 26,8% | 27,8% | Bester: 25,5% | 30,2% | 51,7% | 54,6% |
| s/w | 2,3% | 2,3% | Bester: 1,6% | 2,4% | 12,3% | 11,7% |
| Grafik | 2,9% | 3,2% | Bester: 2,4% | 3,2% | 38,4% | 33,5% |
| Foto | 43,9% | 45,9% | 39,2% | 44,8% | 16,5% | Bester: 16,4% |
Generell komprimiert PNG etwas besser als GIF. Bei verschachtelten Bildern
nimmt die Kompressionsrate stärker ab als bei GIF. JPG komprimiert
verschachtelte Bilder sogar meist besser. Zu beachten ist außerdem
der dramatische Unterschied zwischen Fotos und Grafiken in der Kompression.
Trotz PNG stellt sich immer noch die Frage: Welches Format für welches
Bild?
Faustregel: JPG nur für Fotos im Datennetz, PNG für alles
andere.

![]() |
Testbilder:
Originalgröße: 88x31
|
| Legende:
GIF; GIF mit Verschachtelung; PNG; PNG mit Verschachtelung; JPG; JPG mit Verschachtelung; |
![]() |
Testbilder:
Originalgröße: 1174x888
|
| Legende:
GIF; GIF mit Verschachtelung; PNG; PNG mit Verschachtelung; |
![]() |
Testbilder:
Originalgröße: 640x480 |
| Legende:
GIF; GIF mit Verschachtelung; PNG; PNG mit Verschachtelung; JPG; JPG mit Verschachtelung; |