Artikel
Grafik im Griff
Dem TIFF-Dateiformat aufs Bit geschaut
TIFF ist das 'Tag Image File Format' zum Speichern von pixelorientierten Grafiken. Nicht nur auf dem PC, Macintosh oder Atari, auch unter Unix und VMS kennen viele Programme dieses Format. Wer statt des Bildes lieber die Datei betrachtet, erfährt hier, was ihn an Bit-Mustern erwartet.
Das
Ziel beim Entwickeln der TIFF-Dateistruktur war ein universelles
Format zum Übertragen von Grafiken. Da man diesem Ziel sehr nahe
gekommen ist und die Formatspezifikation veröffentlicht wurde
[1],
konnte sich
TIFF
gut verbreiten. Der universelle Austausch von Bildern beliebiger
Auflösungen und Farben ist unabhängig von der jeweiligen
Hardware mit diesem Dateiformat möglich, auf das sich 1986 Aldus,
Microsoft und einige
Scanner-Hersteller geeinigt haben.
Heute gilt bereits die zweite Version
(Draft 2, 1988) von TIFF.
Bilder der
unterschiedlichsten Auflösungen – schwarz/weiß, in
verschiedenen Graustufen oder farbig – lassen sich speichern.
Die Bilddaten werden stets als
Pixel
abgelegt, nicht als Vektoren.
Deshalb hat sich das TIF-Format vor allem im Bereich der
Scanner und der
Desktop-Publishing
Anwendungen durchgesetzt. Denn gescannte Bilder werden immer
als Pixelmatrix abgelegt und für das Bearbeiten auf
dem Bildschirm und die Ausgabe auf Druckern bitorientiert
weiterverarbeitet. Grafikeditoren, die
TIFF
sowohl einlesen als auch schreiben können, werden oft
mit Scannern mitgeliefert. Die meisten Desktop-Publishing
Programme und Textverarbeitungen können TIFF mindestens
einlesen, zum Beispiel
Pagemaker,
Ventura Publisher und
Wordperfect. Um wirklich sicher
zu gehen, sollte man vor einem Kauf allerdings detailliert nachfragen.
Demgegenüber bevorzugen
CAD-Anwendungen
vektororientierte Formate wie
DXF oder
HPGL,
zumal Videokarten mit Grafikprozessoren und Plotter als
Standardausgabegeräte ebenfalls Vektoren verarbeiten.
Von Kopf bis Fuß
TIFF-Dateien führen die Endung .TIF, auf dem
Macinthosh .TIFF. Die
Datei-Struktur enthält drei verschiedene Bereiche: Dateikopf,
Bilddateiverzeichnisse und die eigentlichen Bilddaten. In einer
TIFF-Datei können Daten für mehrere Bilder gespeichert
werden, der prinzipielle Aufbau ist in
Bild 1
dargestellt. Dabei werden die Daten aus Worten (2 Bytes) und Doppelworten
(4 Bytes) aufgebaut.
Leider gibt es zwei
unterschiedliche Verfahren, die Worte abzuspeichern. Maschinen mit
Intel-Prozessoren legen von den zwei Bytes eines Wortes zuerst das
niederwertige und dann das höherwertige ab, beginnen also mit
dem Last Significant Byte (LSB).
Macintosh-Rechner dagegen
schreiben zuerst das höherwertige, das
Most Significant Byte (MSB).
Mit welchem Verfahren eine
TIFF-Datei geschrieben wurde, läßt sich anhand des ersten
Wortes des Dateiheaders ermitteln. Für die Intel-Methode mit
führendem LSB steht 4949h, bei führendem MSB dagegen 4D4Dh
in diesen Bytes.
Es folgt die Versionsnummer, 002Ah für
Draft 2. Wird als Byte-Anordnung
MSB vor
LSB
verwendet, so heißt das zweite Wort der TIFF-Datei also
002Ah, im anderen Fall 2A00h. Da sich dieses Wort seit langem nicht
mehr geändert hat, wird es von manchen Programmen zum
Identifizieren von TIFF-Dateien abgefragt. Dies ist aber nicht
unproblematisch, denn irgendwann wird sich dieses Wort mit einer
neuen Version ändern.
Die letzte Angabe im Dateikopf ist als Doppelwort der
Offset des ersten
Bilddateiverzeichnisses, auch
Image File Directories (IFD)
genannt, in dem wichtige Parameter der darauffolgenden Bilddaten
festgehalten sind. Ein Offset
gibt immer eine bestimmte Dateistelle an, wobei die Bytes der Datei,
mit Null beginnend, numeriert werden. Beginnt das erste IFD mit dem
achten Byte der Datei, so hat das IFD den Offset
0000 0008h. Wird in der Datei die Intel-Schreibweise mit führendem
LSB verwendet, so steht schließlich in der Datei im dritten und
vierten Wort 0800 0000h.
Jedes IFD beschreibt
zusammen mit den zugehörigen Bilddaten genau ein Bild. Enthält
die Datei Daten mehrerer Bilder, so gibt das letzte Doppelwort eines
IFD
den Offset des nächsten
IFD an. Die Offset-Angabe des
letzten Image File Directories
ist der Nullvektor (0000 0000h). Das Aneinanderreihen von
mehreren Bildern mit ihren Bilddateiverzeichnissen und Bilddaten
läßt das Format also ohne Probleme zu. Viele Programme
können jedoch nur ein Bild pro Datei verarbeiten. Daher ist
beim Ablegen mehrerer Bilder in einer Datei Vorsicht angebracht,
sonst können Bilder verlorengehen!
Vom Bild zum Bit
Das erste Wort jedes
IFDs
enthält die Zahl der folgenden Einträge,
Tags genannt.
Die Tags selbst bestehen
aus jeweils 12 Bytes, das genaue Format erläutert
Bild 2.
Unmittelbar nach dem letzten Eintrag steht der
Offset des nächsten
Verzeichnisses oder als Endmarkierung der Nullvektor.
Welche Tags es gibt und
welche Möglichkeiten sie bieten, das Bild zu gestalten, ist in
der Tabelle erläutert. Jeder Eintrag im Bilddateiverzeichnis
beginnt mit der Nummer des Tags,
das zweite Wort enthält den Parametertyp laut Tabelle.
Es folgt in einem Doppelwort die Anzahl der übergebenen
Parameter, ein weiteres Doppelwort enthält die Parameter
selbst, sofern sie in ein Doppelwort passen. Andernfalls
verweist anstelle der Parameter ein
Offset an die entsprechende
Adresse in der Datei. Die Parameterliste kann zwischen
dem Bilddateiverzeichnis und den zugehörigen Bilddaten stehen.
Die meisten Tags haben
Standardvorgaben, daher müssen nur die
Tags im
Image File Directory
aufgeführt werden, deren Parameter neu definiert werden sollen.
Neben Byte-,
ASCII-,
Short- und
Long-Werten gibt es
den Typ Rational anstelle
von Real. Bei diesem Parametertyp steht im
Tag ein Offset,
der auf zwei 32-Bit-Doppelworte weist, die als Zähler
und Nenner zu interpretieren sind. Durch diese Bruchdarstellung
lassen sich Verhältnisangaben ohne den Genauigkeitsverlust einer
Gleitkommazahl speichern.
Bild 3
enthält eine
Beispieldatei, mit der das mc-Logo in blau und rot auf weißem
Grund dargestellt wird. Dabei haben wir uns auf die unbedingt
notwendigen Tags beschränkt.
Der zweite und dritte Eintrag der
IFD
bestimmt die Bildgröße in Bildpunkten. Damit steht
fest, daß zum Speichern jeder Bildebene 16 Zeilen à 16
Pixel,
also gerade 16 Wörter oder 32 Bytes benötigt werden.
Der sechste Eintrag legt mit Tag
106h die Darstellung mit drei Farbkomponenten fest. Es werden also
vier Bildebenen für Blau, Rot, Grün und Intensity benötigt.
Der achte Tag gibt den
Offset an, bei dem die
Offsets der vier Bildebenen
zu finden sind. In
Bild 3
sind die Offsetangaben mit
den Zielpunkten in der Datei farbig verbunden.
Tag 10 und 11 sind
Beispiele für Einträge, die den Parametertyp 5 verwenden
und deshalb einen Offset auf
die eigentlichen Parameter enthalten, die im Doppelwort des
Tags keinen Platz finden.
Als letzte Angabe im ersten IFD bestimmt der Nullvektor bei
Offset 009Ah, daß keine
weiteren Bilddatenverzeichnisse mehr folgen.
Nach der IFD
folgen zunächst die 4 Doppelworte, welche die Parameter für
Tag 10 und 11 enthalten.
Dann erst beginnen die Bilddaten. Die Daten sind für unseren
Fall in vier Bildebenen, auch Streifen genannt, abgelegt
(für jede Farbe eine). Dabei belegt jeder Bildpunkt in jeder
Ebene genau ein Bit.
Programmierer aufgepaßt
Der
Teufel steckt – wie immer – im Detail. So kann die
Zuordnung der Bitmatrixebenen zu den Grundfarben
(siehe Tag 11Ch,
PlanarConfiguration in der
Tabelle)
hardware- oder softwareabhängig sein, teilweise gibt es zwischen
DOS
und X-Window unter Unix ebenfalls
Abweichungen. Unter DOS gilt die Reihenfolge
Blau-Grün-Rot(-Intensity)
entsprechend der hardwaremäßigen Realisierung als Planes
0001b, 0010b, 0100b und 1000b.
Viele Programme nutzen nicht den kompletten
Tag-Umfang, sondern nur eine Untermenge.
Alle nicht bekannten Tags werden
dann einfach übergangen. Tag 103h
gibt an, mit welchem Kompressionsverfahren die folgenden Daten
gepackt worden sind. Kennt ein Programm diesen Eintrag nicht, so sind
komprimierte Bilddaten unbrauchbar. Wenn sehr viele Bilder archiviert
werden müssen, dann ist das Komprimieren ohnehin zwingend
notwendig. Die Kompressionsverfahren wurden durch das
'International Telegraph and Telephone
Consultative Committee' (CCITT) genormt. Das 1985 erschienene
Standardwerk 'Terminal Equipment and Protocols for
Telematic Services' dieses Gremiums beschreibt ausführlich die
verwendeten Verfahren, deren Beschreibung leider den Rahmen eines
Artikels sprengt. Besonders die Kompression nach
CCITT 3
wird von vielen Programmen unterstützt.
Ingo Eickmann
Literatur
- [1] Tag Image File Format Specification, Draft 2, Microsoft Corporation & Aldus Corporation, 1988.
- [2] Hogan, Thom: Die PC-Referenz für Programmierer, Systhema Verlag München, 1988.
Hex-Werte der TIFF-Datei |
Bedeutung |
---|---|
Dateikopf: | |
xxxx |
Byteanordnung:
|
xxxx |
Version
|
xxxx xxxx |
Offset des ersten Bilddatenverzeichnisses bezogen auf den Dateianfang |
1. Bilddatenverzeichnis (IFD): | |
xxxx |
Anzahl der Einträge |
xxxx xxxx |
Einträge (Tags) laut Tabelle, Struktur wie in Bild 2, je Eintrag 12 Bytes |
xxxx xxxx |
Offset des nächsten Bilddatenverzeichnisses, Nullvektor beim letzen IFD. |
Bilddaten zum 1. Bilddatenverzeichnis: | |
xxxx ... |
Bilddaten, Interpretation laut Tags |
2. Bilddatenverzeichnis, sofern vorhanden | |
... |
Eintrag (Tag): xxxx xxxx xxxx xxxx xxxx xxxx (immer 6 Worte = 12 Bytes) Code laut Tabelle Parametertyp: 1: Byte (8 Bit) 2: ASCII (8 Bit), letztes Byte des Strings muß 0 sein. 3: Short (16 Bit) 4: Long (32 Bit) 5: Rational (Zähler, Nenner, jeweils 32 Bit) Parameteranzahl Wert oder Offset, wenn der Wert größer als ein Doppelwort ist.
Offset | Daten (hex, Speicherabbild) | Beschreibung |
---|---|---|
Dateikopf: | ||
0000 |
4949 |
Byteanordnung: LSB zuerst |
0002 |
2A00 |
TIFF-Version: Draft 2 |
0004 |
08000000 |
Offset für 1. Bilddatenverzeichnis |
1. Bilddatenverzeichnis (IFD): | ||
0008 |
0C00 |
12 Einträge (Tags) |
000A |
FF00 0300 01000000 01000000 |
1.Tag: OldSubFile volle Auflösung |
0016 |
0001 0300 01000000 10000000 |
2.Tag: ImageWidth 16 Pixel |
0022 |
0101 0300 01000000 10000000 |
3.Tag: ImageLength 16 Pixel |
002E |
0201 0300 01000000 01000000 |
4.Tag: BitsPerSample 1 |
003A |
0301 0300 01000000 01000000 |
5.Tag: Compression keine |
0046 |
0601 0300 01000000 02000000 |
6.Tag: PhotometricInterpretation RGB |
0052 |
0701 0300 01000000 01000000 |
7.Tag: Thresholding Bilevel-Scan |
005E |
1101 0400 04000000 2E010000 |
8.Tag: StripOffsets bei Offset 012E |
006A |
1501 0300 01000000 04000000 |
9.Tag: SamplesPerPixel RGB & Intensity |
0076 |
1A01 0500 01000000 9E000000 |
10.Tag: XResolution bei Offset 009E |
0082 |
1B01 0500 01000000 A6000000 |
11.Tag: YResolution bei Offset 00A6 |
008E |
1C01 0300 01000000 02000000 |
12.Tag: PlanarConfiguration mehrere Bildebenen |
009A |
00000000 |
Nullvektor: keine weiteren IFDs |
009E |
41000000 01000000 |
XResolution: 41/1 pro Zoll |
00A6 |
2F000000 01000000 |
YResolution: 2F/1 pro Zoll |
Bilddaten: | ||
|
||
00AE |
0000 7FFE 7FFE 7FFE 7FFE 7FFE |
1. Bildebene: 1=Blau, 'c' maskiert |
00CE |
0000 7FFE 7FFE 7FFE 7FFE 7FFE |
2. Bildebene: 1=Grün, 'mc' maskiert |
00EE |
0000 7FFE 7FFE 7FFE 7FFE 7FFE |
3. Bildebene: 1=Rot, 'm' maskiert |
010E |
0000 7FFE 7FFE 7FFE 7FFE 7FFE |
4. Bildebene: 1=Intensity, helle Box |
012E |
AE000000 |
Offset der 1. Bildebene |
CE000000 |
Offset der 2. Bildebene | |
EE000000 |
Offset der 3. Bildebene | |
0E010000 |
Offset der 4. Bildebene |
Tabelle: Die Tags charakterisieren das Bild | ||
---|---|---|
Code | Tag-Beschreibung | Parametertyp |
0FD h | TiffClass, TIFF-Klasse
|
Short |
0FE h | SubFileType
|
Long |
0FF h | OldSubFileType
|
Short |
100 h | ImageWidth, Bildbreite in Pixel | Short |
101 h | ImageLength, Bildlänge in Pixel Die Bildmatrix hat die Größe ImageWidth × ImageLength. |
Short |
102 h | BitsPerSample, Bits pro Abtastung Standardeinstellung: 1 (monochrom, RGB) |
Short |
103 h | Compression, Datenkompression
|
Short |
106 h | PhotometricInterpretation, Photometrische Interpretation der Ebenen
|
Short |
107 h | Thresholding, Empfindlichkeitsschwelle
|
Short |
108 h | CellWidth, Zellenbreite Bei einer Empfindlichkeitsschwelle (107 h) von 2 gibt dieser Wert die Breite der Halbton-Matrix in Abtastpunkten an. |
Short |
109 h | CellLength, Zellenlänge Bei einer Empfindlichkeitsschwelle (107 h) von 2 gibt dieser Wert die Länge der Halbton-Matrix in Abtastpunkten an. |
Short |
10A h | FillOrder, Reihenfolge der Datenbits
|
Short |
10D h | DocumentName, Dokumentname | ASCII |
10E h | ImageDescription, Bildbeschreibung als String | ASCII |
10F h | Marke (z.B. Scanner-Hersteller) | ASCII |
110 h | Model (z.B. Scanner-Modell) | ASCII |
111 h | StripOffsets, Verweis auf Streifenanfang | Long |
112 h | Orientation, Orientierung
|
Short |
115 h | SamplesPerPixel, Abtastung pro Punkt
|
Short |
116 h | RowsPerStrip, Linien pro Streifen Standard: 2^32 − 1 (darstellbares Maximum) |
Long |
117 h | StripByteCounts, Bytes pro Streifen Standard: 2^32 − 1 (darstellbares Maximum) |
Long |
118 h | MinSampleValue, Kleinster Abtastwert Standard: 0 |
Short |
119 h | MaxSampleValue, Größter Abtastwert Standard: 2^(BitsPerSample) − 1 |
Short |
11A h | XResolution, Auflösung in X-Richtung Anzahl der Punkte pro Einheit (ResolutionUnit) |
Rational |
118 h | YResolution, Auflösung in Y-Richtung Anzahl der Punkte pro Einheit (ResolutionUnit) |
Rational |
11C h | PlanarConfiguration, Anordnung der Ebenen
|
Short |
11D h | PageName, Seitenname | ASCII |
11E h | XPosition Position des linken Bildrands auf der Druckseite |
Rational |
11F h | YPosition Position des oberen Bildrands auf der Druckseite |
Rational |
120 h | FreeOffsets, Verweis auf einen Leereintrag | Long |
121 h | FreeBytesCount, Größe des Leereintrags | Long |
122 h | GrayResponseUnit, Grauwert-Aufnahme-Zahl
|
Short |
123 h | GrayResponseCurve, Tabelle der Grauwerte Für jeden abgetasteten Grauwert enthält die Tabelle einen Eintrag mit einer Anzahl Bits entsprechend BitsPerSample. |
Short |
124 h | Group3Options, CCITT Gruppe 3 Optionen
|
Short |
125 h | CCITT Gruppe 4 Optionen
|
Long |
128 h | ResolutionUnit, Einheit/Auflösung
|
Short |
129 h | PageNumber, Blattnummer Anzahl der Blätter in der Datei |
Short |
12C h | ColorResponseUnit, Farbwert-Aufnahme-Zahl
|
Short |
12D h | ColorResponseCurve, Tabelle der Farbwerte Für jeden möglichen Grauwert (2^BitsPerSample) enthält die Tabelle je einen Rot-, Grün- und Blaueintrag. |
Short |
131 h | Software Name des Programms, das die TIFF-Datei erzeugt hat. |
ASCII |
132 h | DateTime, Datum/Uhrzeit | ASCII |
133 h | ScreenFrequency | Rational |
134 h | ScreenAngle | Rational |
135 h | ScreenPattern
|
Short |
136 h | SpotFunction | ASCII |
137 h | InvertSpotFunction | ASCII |
138 h | TransferFunction | ASCII |
139 h | InvertTransferFunction | ASCII |
13A h | InkColor | ASCII |
13B h | Artist, Autor der TIFF-Datei | ASCII |
13C h | HostComputer | ASCII |
13D h | Histogram | Long |
13E h | TargetPrinter | ASCII |
13F h | StripByteCountMax | Short |
aus mc 10/90 – Seite 56-61