Artikel

TIFF

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. [1] Tag Image File Format Specification, Draft 2, Microsoft Corporation & Aldus Corporation, 1988.
  2. [2] Hogan, Thom: Die PC-Referenz für Programmierer, Systhema Verlag München, 1988.

Bild 1. Der Dateikopf und die Struktur einer TIFF-Datei.
Hex-Werte der
TIFF-Datei
Bedeutung
Dateikopf:
xxxx Byteanordnung:
4949h:
LSB zuerst
4D4Dh:
MSB zuerst
xxxx Version
002Ah:
Draft 2, 1988
xxxx xxxx Offset des ersten
Bilddatenverzeichnisses
bezogen auf den Dateianfang
1. Bilddatenverzeichnis (IFD):
xxxx Anzahl der Einträge
xxxx xxxx
xxxx xxxx
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.
Bild 2. Die Einträge (Tags) haben ein festes Format.

 

Bild 3. Diese Datei enthält das mc-Logo im TIFF-Format ...
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:
   
  • 16 Zeilen à 16 Pixel (1 Wort) pro
    Bildebene
  • weiße Box mit schwarzem Rahmen, darin
    ein blaues 'm' und ein rotes 'c'
00AE 0000 7FFE 7FFE 7FFE 7FFE 7FFE
7F8E 7F76 7F7E 7F76 7F8E 7FFE
7FFE 7FFE 7FFE 0000
1. Bildebene: 1=Blau, 'c' maskiert
00CE 0000 7FFE 7FFE 7FFE 7FFE 7FFE
758E 6A76 6A7E 6A76 6A8E 7FFE
7FFE 7FFE 7FFE 0000
2. Bildebene: 1=Grün, 'mc' maskiert
00EE 0000 7FFE 7FFE 7FFE 7FFE 7FFE
75FE 6AFE 6AFE 6AFE 6AFE 7FFE
7FFE 7FFE 7FFE 0000
3. Bildebene: 1=Rot, 'm' maskiert
010E 0000 7FFE 7FFE 7FFE 7FFE 7FFE
7FFE 7FFE 7FFE 7FFE 7FFE 7FFE
7FFE 7FFE 7FFE 0000
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
1:
Bilevel-Bild
2:
Graustufen-Bild
3:
Palette-Bild
4:
RGB-Farbbild
Short
0FE h SubFileType
Bit 0:
 1: reduziertes Abbild
Bit 1:
 1: eine Seite eines Bildes aus mehreren Seiten
Bit 2:
 1: Transparenzmaske
Bit 3:
 1: Separation Layer
(Standard: 0)
Long
0FF h OldSubFileType
1:
volle Auflösung
2:
reduziertes Abbild
3:
Bildausschnitt, nur bei einer Datei mit mehreren Bildern.
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
1:
keine Kompression, hohe Packungsdichte,
neue Zeile an Wortgrenze
2:
CCITT Gruppe 3 (1-D), modifiziert
3:
CCITT Gruppe 3 (Facsimile-kompatibel)
4:
CCITT Gruppe 4 (Facsimile-kompatibel)
5:
LZW Kompression
32771:
keine Kompression, hohe Packungsdichte,
neue Zeile an Bytegrenze
32773:
PackBits Kompression
(Standardeinstellung: 1)
Short
106 h PhotometricInterpretation,
Photometrische Interpretation der Ebenen
0:
kleinster Wert ist weiß
1:
kleinster Wert ist schwarz
2:
RGB-Darstellung, Ebenenreihenfolge wie hardwaremäßig
realisiert (Blau-Grün-Rot-Intensity), kleinster Wert ist
geringste Intensität
3:
Tönung, Sättigung, Helligkeit
4:
Transparenzmaske
5:
Separation Layer
Short
107 h Thresholding, Empfindlichkeitsschwelle
1:
Bilevel-Scan/Punkt für Punkt - Abtastung
2:
Dithered-Scan/Halbtonabtastung, z.B. Grau als
Kombination eines schwarzen und weißen Punktes
3:
Error Diffused/Verfälschte Halbtonabtastung
(Standardeinstellung: 1)
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
1:
Das höchstwertige Bit wird links abgebildet
2:
Das höchstwertige Bit wird rechts abgebildet.
(Standardeinstellung: 1)
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
1:
Reihen von links nach rechts, erste Reihe oben.
2:
Reihen von rechts nach links, erste Reihe oben.
3:
Reihen von rechts nach links, erste Reihe unten.
4:
Reihen von links nach rechts, erste Reihe unten.
5:
Reihen von oben nach unten, erste Reihe links.
6:
Reihen von oben nach unten, erste Reihe rechts.
7:
Reihen von unten nach oben, erste Reihe rechts.
8:
Reihen von unten nach oben, erste Reihe links.
(Standardeinstellung: 1)
Short
115 h SamplesPerPixel, Abtastung pro Punkt
1:
Einfarbig oder Grauwerte
3:
Dreifarben-Abtastung
(Standardeinstellung: 1)
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
1:
Eine Bildebene, Abtastwerte sequenziell.
2:
Mehrere Abtastebenen nacheinander.
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
1:
1/10 der Einheit
2:
1/100 der Einheit
3:
1/1000 der Einheit
4:
1/10000 der Einheit
5:
1/100000 der Einheit
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
Bit 0:
 0: eindimensionale Umwandlung
 1: zweidimensionale Umwandlung
Bit 1:
 1: nicht komprimierender Modus
Bit 2:
 1: Füllbits vor End of Line
(Standard: 0)
Short
125 h CCITT Gruppe 4 Optionen
Bit 0:
 unbenutzt
Bit 1:
 1: nicht komprimierender Modus
(Standard: 0)
Long
128 h ResolutionUnit, Einheit/Auflösung
1:
keine Auflösungseinheit spezifiziert
2:
Zoll
3:
Zentimeter
(Standard: 2)
Short
129 h PageNumber, Blattnummer
Anzahl der Blätter in der Datei
Short
12C h ColorResponseUnit, Farbwert-Aufnahme-Zahl
1:
1/10 der Einheit
2:
1/100 der Einheit
3:
1/1000 der Einheit
4:
1/10000 der Einheit
5:
1/100000 der Einheit
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
1:
Darstellung auf Pixelbasis
2:
Bildschirm auf Linienbasis
3:
PostScript-Funktionen werden unterstützt
(Standardeinstellung: 1)
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