Dies ist ein binäres Format in Big-Endian Anordnung. Folgende Datentypen kommen zur Anwendung:
char | String mit 8-Bit Kodierung |
---|---|
uint8 | vorzeichenlose 8-Bit Zahl |
uint32 | vorzeichenlose 32-Bit Zahl |
Die Datei beginnt mit der Signatur. Danach folgen die einzelnen Blocks direkt aufeinander.
Jede PNG Datei beginnt mit folgender Signatur:
<89 50 4E 47 0D 0A 1A 0A>
Auf die Signatur folgt direkt der erste Block.
Position | Grösse | Typ | Wert |
---|---|---|---|
0 | 4 Byte | uint32 | Blockgrösse |
4 | 4 Byte | char | Blocktyp |
8 | Blockgrösse | * | Blockdaten |
Blockgrösse + 8 | 4 Byte | uint32 | Prüfsumme |
Die Prüfsumme ist eine normale CRC-32 Prüfsumme über Blocktyp und Blockdaten.
Position | Grösse | Typ | Wert |
---|---|---|---|
0 | 4 Byte | uint32 | Blockgrösse |
4 | 4 Byte | char | Blocktyp |
8 | 4 Byte | uint32 | Bildbreite |
12 | 4 Byte | uint32 | Bildhöhe |
16 | 1 Byte | uint8 | Bittiefe |
17 | 1 Byte | uint8 | Farbmodell |
18 | 1 Byte | uint8 | Kompression |
19 | 1 Byte | uint8 | Prediktor |
20 | 1 Byte | uint8 | Interlacing |
21 | 4 Byte | uint32 | Prüfsumme |
Für das Farbmodell sind folgende Werte möglich:
Wert | Modell |
---|---|
0 | Graustufen |
2 | RGB |
3 | RGB indexiert |
4 | Graustufen mit Alphakanal |
6 | RGB mit Alphakanal |
Kompression ist immer 0 (Deflate).
Prediktor ist immer 0 (PNG Prediktor).
Interlacing kann die Werte 0 (kein Interlacing) und 1 (Adam7) haben.
Dieser Block kommt nur im indexierten Farbraum vor, ist dann aber zwingend notwendig.
Position | Grösse | Typ | Wert |
---|---|---|---|
0 | 4 Byte | uint32 | Blockgrösse |
4 | 4 Byte | char | Blocktyp |
8 | Blockgrösse | uint8 | Palette |
Blockgrösse + 8 | 4 Byte | uint32 | Prüfsumme |
Die Palette hat einen Eintrag für jede verwendete Farbe, welcher wiederum aus drei uint8 für den Rot-, Grün- und Blauanteil der Farbe besteht.
Position | Grösse | Typ | Wert |
---|---|---|---|
0 | 4 Byte | uint32 | Blockgrösse |
4 | 4 Byte | char | Blocktyp |
8 | Blockgrösse | * | Bilddaten |
Blockgrösse + 8 | 4 Byte | uint32 | Prüfsumme |
Falls mehrere IDAT Blöcke existieren, müssen die Bilddaten der einzelnen Blöcke in der Reihenfolge des Auftretens in der Datei zusammengesetzt werden.
Position | Grösse | Typ | Wert |
---|---|---|---|
0 | 4 Byte | uint32 | Blockgrösse |
4 | 4 Byte | char | Blocktyp |
8 | 1 Byte | uint8 | Umrechnungspriorität |
9 | 4 Byte | uint32 | Prüfsumme |
Ist dieser Block enthalten, so sind die Bilddaten im sRGB Farbraum.
Für die Umrechnungspriorität sind folgende Werte möglich:
0 | /Perceptual |
---|---|
1 | /RelativeColorimetric |
2 | /Saturation |
3 | /AbsoluteColorimetric |
Position | Grösse | Typ | Wert |
---|---|---|---|
0 | 4 Byte | uint32 | Blockgrösse |
4 | 4 Byte | char | Blocktyp |
8 | * | char | Profilname |
* | 1 Byte | uint8 | 0 |
* | 1 Byte | uint8 | Kompression |
* | * | * | ICC-Profildaten |
* | 4 Byte | uint32 | Prüfsumme |
Der Profilname ist in ISO Latin-1, und kann im Namen selbst kein 0-Byte enthalten.
Kompression ist immer 0 (Deflate).
Position | Grösse | Typ | Wert |
---|---|---|---|
0 | 4 Byte | uint32 | Blockgrösse |
4 | 4 Byte | char | Blocktyp |
8 | 4 Byte | uint32 | Gammawert (invers) |
12 | 4 Byte | uint32 | Prüfsumme |
Der inverse Gammawert ist auf einer Skala von 0 - 100'000.
Formel zur Umrechnung in den Wert für PDF:
gamma = 100000.0 / gamma
Position | Grösse | Typ | Wert |
---|---|---|---|
0 | 4 Byte | uint32 | Blockgrösse |
4 | 4 Byte | char | Blocktyp |
8 | 4 Byte | uint32 | xw |
12 | 4 Byte | uint32 | yw |
16 | 4 Byte | uint32 | xr |
20 | 4 Byte | uint32 | yr |
24 | 4 Byte | uint32 | xg |
28 | 4 Byte | uint32 | yg |
32 | 4 Byte | uint32 | xb |
36 | 4 Byte | uint32 | yb |
40 | 4 Byte | uint32 | Prüfsumme |
Die x und y Werte sind auf einer Skala von 0 - 100'000.
Formelsatz für die Umrechnung in PDF-Werte:
xw = xw / 100000.0 yw = yw / 100000.0 xr = xr / 100000.0 yr = yr / 100000.0 xg = xg / 100000.0 yg = yg / 100000.0 xb = xb / 100000.0 yb = yb / 100000.0 Xw = xw / yw Yw = 1 Zw = (1 - xw - yw) / yw zr = 1 - xr - yr zg = 1 - xg - yg zb = 1 - xb - yb mxr = yg * zb - zg * yb mxg = zr * yb - yr * zb mxb = yr * zg - zr * yg d = mxr * xr + mxg * xg + mxb * xb Sr = (mxr * Xw + (yb * Zw - zb) * xg + (zg - yg * Zw) * xb) / d Sg = (mxg * Xw + (yr * Zw - zr) * xb + (zb - yb * Zw) * xr) / d Sb = (mxb * Xw + (yg * Zw - zg) * xr + (zr - yr * Zw) * xg) / d Xr = xr * Sr Yr = yr * Sr Zr = zr * Sr Xg = xg * Sg Yg = yg * Sg Zg = zg * Sg Xb = xb * Sb Yb = yb * Sb Zb = zb * Sb /WhitePoint [Xw Yw Zw] /Matrix [Xr Yr Zr Xg Yg Zg Xb Yb Zb]
Position | Grösse | Typ | Wert |
---|---|---|---|
0 | 4 Byte | uint32 | Blockgrösse |
4 | 4 Byte | char | Blocktyp |
8 | 4 Byte | uint32 | Prüfsumme |
Dieser Block enthält keine Blockdaten. Er markiert lediglich das Dateiende.
Diskussion