Seminar Multimedia und Electronic Publishing
Kapitel 2: PNG


next up gif externalexternalexternalexternal

Next: Zusatzchunks Up: Aufbau einer PNG-Datei Previous: Chunks


Unverzichtbare Chunks

 

Kommen wir nun zu der Speicherung der eigentlichen Bildinformation. Sämtliche Information, die zum korrekten Darstellen eines Bildes unbedingt erforderlich ist, steht in den unverzichtbaren Chunks (critical chunks). In jeder PNG-Datei müssen mindestens diese Chunks enthalten sein und jedes Programm, das mit PNG-Dateien arbeitet, muß sie kennen und auswerten können.

IHDR - Image Header

Der IHDR-Chunk bildet den Kopf der Datei, er muß als erster Chunk direkt nach der Signatur stehen und enthält die in der folgenden Tabelle aufgeführten Informationen:

 

Länge Name Mögliche Werte
4 Byte Breite 1 - tex2html_wrap_inline300
4 Byte Höhe 1 - tex2html_wrap_inline300
1 Byte Bittiefe 1,2,4,8,16
1 Byte Farbtyp 0,2,3,4,6
1 Byte Kompressionsmethode 0
1 Byte Filtermethode 0
1 Byte Interlacemethode 0,1
Tabelle: Header-Chunk

 

Die Breite und Höhe wird jeweils in Bildpunkten angegeben. Die Bittiefe gibt die Anzahl Bits pro Farbwert an, dies ist nicht zwingenderweise identisch mit der Anzahl Bits pro Bildpunkt. Welche 2er-Potenzen bei der Bittiefe wirklich gültig sind, hängt von dem verwendeten Farbtyp ab.

Der Farbtyp legt fest, wie die einzelnen Bildpunkte abgespeichert sind und wie ihre Werte zu interpretieren sind. Er ist eine Kombination der drei Werte 1 (es wird eine Palette benutzt), 2 (das Bild enthält ,,Farben``, im Gegensatz zu Grauwerten) und 4 (es wird ein Alpha-Kanal benutzt). Dadurch sind für den Farbtyp die in der folgenden Tabelle aufgelisteten Werte zulässig:

 

Farbtyp Gültige
Bittiefen
Interpretation
0 1,2,4,8,16 Jeder Bildpunkt enthält einen Grauwert.
2 8,16 Jeder Punkt enthält RGB-Werte.
3 1,2,4,8 Jeder Punkt enthält einen Palette-Index. Bei diesem Typ muß ein
PLTE-Chunk vorhanden sein.
4 8,16 Jeder Punkt enthält einen Grauwert, gefolgt von einem Alpha-Wert.
6 8,16 Jeder Punkt enthält RGB-Werte, gefolgt von einem Alpha-Wert.
Tabelle: Farbtypen

 

Die Werte 1, 5 und 7 sind nicht zulässig. Ein Wert von 1 oder 5 würde ja bedeuten, daß eine Palette ohne Farben benutzt werden soll, d.h. die Palette darf nur Grauwerte enthalten. Dies erreicht man aber auch, indem man in einer ,,farbigen`` Palette nur Grauwerte einträgt oder gleich ein Grauwert-Bild speichert. Der Wert 7 (Farbtabelle + Alpha Kanal) klingt im ersten Moment sinnvoll, man könnte ja auch in einem Bild des Typs 3 bestimmte Bereiche transparent machen wollen. Jedoch wurde dies von den Entwicklern des PNG-Formats auf andere Weise gelöst. Es gibt die Möglichkeit, neben der Farbtabelle noch eine ,,Alpha-Tabelle`` abzuspeichern, in der für jeden Farbindex ein Alpha-Wert gespeichert werden kann. Damit hat dann jeder Index eine eindeutige Farbe und ebenso einen eindeutigen Alpha-Wert (der genaue Aufbau des tRNS-Chunks befindet sich in [Gro96a]).

Das Feld Kompressionsmethode darf bisher nur den Wert 0 enthalten, d.h. es gibt nur eine Kompressionsmethode, mit der jedes Bild komprimiert sein muß. Andere Werte sind für zukünftige Erweiterungen reserviert.

Auch bei der Filtermethode ist bisher nur der Wert 0 erlaubt. Er steht für ,,adaptives Filtern mit 5 Grundfilter``, die bisher einzige Filtermethode. Ein Filter ist eine Methode, mit der die einzelnen Bildzeilen vor dem Komprimieren bearbeitet werden, um eine bessere Kompression zu erzielen (siehe Abschnitt Filter).

Bei der Interlacemethode können zwei Werte angegeben werden: 0 (kein Interlace) und 1 (Adam7 Interlace). Auf das Interlacing wird in einem späteren Abschnitt eingegangen (Abschnitt Interlacing).

PLTE - Palette

Der Palette-Chunk liefert die Farbtabelle, die beim Farbtyp 3 unbedingt erforderlich ist und die in den Modi 2 und 6 (Echtfarben und Echtfarben + Alpha) optional verwendet werden kann. Er ist also nur bei farbindizierten Bildern wirklich ein ,,unverzichtbarer`` Chunk, dennoch muß er von allen Programmen verstanden werden, da ansonsten manche PNG-Dateien nicht eingelesen werden könnten.

Die Tabelle enthält bis zu 256 Farbeinträge, wobei jede Farbe als RGB-Wert gespeichert wird:

  

figure137
Abbildung: Palette-Chunk

Die RGB-Werte belegen immer jeweils 1 Byte, unabhängig von der verwendeten Bittiefe. Die Anzahl der Farben in der Palette wird anhand der Chunk-Länge ermittelt, wobei diese durch 3 teilbar sein muß. Ist ein Palette-Chunk in einer PNG-Datei vorhanden, so muß dieser dem ersten IDAT-Chunk vorausgehen. Mehrere Palette-Chunks sind nicht erlaubt.

Für den Farbtyp 3 gilt: Die erste Farbe in der Tabelle wird mit dem Index 0 angesprochen, die zweite mit 1, ...usw. Die Palette darf nicht mehr als tex2html_wrap_inline328 Einträge enthalten, kann jedoch durchaus weniger Farben umfassen. Im letzteren Fall gilt eine Referenz auf einen nicht vorhandenen Farbeintrag als Fehler.

Ein Palette-Chunk darf auch bei Echtfarbenbildern (Modus 4 und 6) mitgespeichert werden. Ist dies der Fall, wird durch die Tabelle ein Satz von Farben vorgeschlagen, mit dem die Farbanzahl des Bildes reduziert werden kann. Jede Farbe im Bild wird dabei auf denjenigen Farbeintrag in der Tabelle abgebildet, der der ursprünglichen Farbe am ähnlichsten ist. Das Bild kann dann auch auf Systemen dargestellt werden, die keine direkte Anzeige von Echtfarbenbildern erlauben.

IDAT - Image Data

IDAT-Chunks enthalten die Bilddaten. Wie die Daten hier gespeichert sind, hängt von den Einträgen im IHDR-Chunk ab.

Größe und Anzahl der IDAT-Chunks in einer Datei ist beliebig, sie müssen nur direkt aufeinander folgen. Es gibt auch keinerlei Beschränkung, an welcher Stelle die Daten getrennt werden dürfen, hier ist alles erlaubt. Zum Decodieren gilt also die Konkatenation der Daten aller IDAT-Chunks als Eingabestrom für den weiteren Bearbeitungsschritt.

IEND - Image Trailer

Dieser Chunk wird als letzter Chunk in einer PNG-Datei gespeichert, er markiert das Ende der Datei und enthält ein leeres Datenfeld.




next up gif externalexternalexternalexternal

Next: Zusatzchunks Up: Aufbau einer PNG-Datei Previous: Chunks

Matthias Baas, Montag, 20. Januar 1997, 16:21:55 Uhr MET