Inhalt ist aus dem Jahr 2002 zusammengetragen, evtl. ist nicht mehr alles aktuell.
von Christoph Müller, Publishing Tools SupportDigitale Bilder und Grafiken sind etwas vertrautes: schon seit etwa 17 Jahren gehts am Computer bunt zu. Mit IBM und dem PC-Standard kamen in den Siebzigern die ersten brauchbaren Farbmonitore und die passenden Grafikformate. Dieses Fachreferat beschäftigt sich mit der Theorie und dem Aufbau aktueller Datenformate, welche heute eingesetzt werden, um Informationen zu übermitteln, darzustellen und zu archivieren. Im speziellen werden die Formate TIFF, EPS, sowie die Druckersprache PostScript besprochen.
Kapitel: 1. Grundlagen, 2. Tag Image File Format (TIFF), 3. PostScript, 4. EPS-Dateien
1. Grundlagen |
Die Vektorgrafik
Um einfache Grafiken wie Kreise oder Rechtecke zu konstruieren, bedienen sich die Programme der Vektorfunktion. Dabei ist es egal, ob es sich um ein Malprogramm oder eine CAD Anwendung handelt. Während das CAD Programm die Vektoren intern auch als solche behandelt, greift das Malprogramm auf eine Bitmaske zurück.
Eine Sonderstellung bei geometrischen Elementen bilden die Kurven. Um eine Kurve irgendwo im Raum mit Vektoren zu beschreiben, geht man in der Mathematik kryptische Wege. Über Näherungsverfahren und Normalgleichungen werden solche Kurven beschrieben.
Eine beinahe allen Programmen bekannte Funktion, ist die Annäherung an Kurven über die Bezier-Polygone. Die Bezier-Annäherung geht folgendermassen vor sich: Jeder Bereich einer Kurve wird durch eine Tangente beschrieben. Dort wo sich die Tangenten schneiden, erhält man einen Scheitelpunkt, der wiederum einen entsprechenden Punkt auf der Kurve hat.
Bsp.: Über die beiden Punkte Pa und Pe werden die Tangenten an die Kurven gelegt. Der Scheitelpunkt der Kurven liegt lotrecht unter dem Punkt Pt.
Systemintern werden dann die so beschriebenen Polygonzüge verwaltet und verrechnet. Bezier-Kurvenzüge kennt man vor allem aus den Freihandfunktionen von Adobe Illustrator und den Pfadfunktionen in Adobe Photoshop.
Rastergrafiken
Für die Darstellung von Raster braucht es keine komplizierten Formeln. Um ein Bild in Raster aufzuteilen, wird um das Bild einen Rahmen gelegt, der sogenannte Framebuffer. In diesen Framebuffer wird dann ein Koordinatensystem, ähnlich den Vektoren, gelegt. Allerdings nur zweidimensional. Die Achseneinheiten entsprechen den maximal darstellbaren Pixeln. Jedes Feld innerhalb des Framebuffer kann auf diese Weise einzeln angesprochen werden. So kann man recht einfach eine S/W Grafik erstellen. Soll die Grafik Graustufen enthalten, können heutige Videokontroller pro Einheit bis zu 8-Bit tief Abstufungen hinterlegen. Somit sind pro Pixel 256 Abstufungen möglich. Soll die Grafik aber Farben beinhalten, wird die Sache etwas komplizierter. Moderne Farbmonitore erzeugen Farben mittels additiver Farbmischung von Rot, Grün und Blau. So werden drei Graustufenbilder erzeugt und jeweils die entsprechenden Phosphorteilchen mit der entsprechenden Intensität am Monitor angeregt. Das klingt zwar einfach, ist aber gar nicht so einfach zu verwalten.
Grafikstandards
Die meistens Standards, die auf unseren Systemen verbreitet sind, wurden von Programmherstellern entwickelt, um mit ihrer Software Bilddaten zu speichern. Ein gutes Beispiel ist das PCX Format von PC Paintbrush. Das Grafikprogramm setzte sich schnell durch und so wurde sein Format zu einem Austauschformat. Mittlerweile entstehen Formate, welche zum Software- und System-unabhängigen Datenaustausch entwickelt worden sind. Die beiden populärsten sind TIFF und GIF.
Im folgenden Unterkapitel möchte ich die wichtigsten Formate auflisten und eine kurze Beschreibung dazu geben. Auf die wichtigsten Formate der grafischen Industrie gehe ich danach noch genauer ein.
DXF (Drawing Exchange Format) stammt von der Firma Autodesk. Es eignet sich für den Austausch von zwei- und dreidimensionalen Grafiken. DXF Dateien liegen meist in ASCII-Code vor. Das Binärformat zu DXF heisst DXB. Alle bekannten CAD Systeme haben eine DXF-Schnittstelle.
IGES (Initial Graphics Exchange Specification). Dieser Organisation gehören alle grossen Firmen der Konstruktionsindustrie an. IGES-Grafiken gelten weltweit als Standard für alle dreidimensionalen Konstruktionen. Die IGES-Grafiken haben ASCII- oder Binärformat.
WMF (Windows Meta-File Format). WMF wird in der Regel nur von Windows selber oder seinen Applikationsprogrammen genutzt. Die Dateien liegen Binär vor.
TIFF (Tag Image File Format). Die Väter von TIFF sind Microsoft und Aldus. TIFF Dateien sind reine Austauschdateien und basieren auf den Konventionen der CCITT-Normen für Computerkommunikation.
GIF (Graphics Interchange Graphic). Entwickelt durch Compuserve in Ohio. GIF liegt in binären Daten vor und ist auf allen Betriebssystemen zu finden.
Neben diesen Formaten existieren noch ein Reihe von weiteren. Die gebräuchlichstene wären: MSP (Microsoft Paint) oder RLE (Run Length Encoded).
2. Tag Image File Format (TIFF) |
Das TIFF wurde von Anfang an so konzipiert, das es eine Vielzahl von Speichermöglichkeiten bietet. So ist TIFF in der Lage, Bitmap, Grautöne, RGB und CMYK Farbwerte zu speichern. Diese Möglichkeiten machen das TIFF-Format etwas kompliziert, dafür desto vielseitiger einsetzbar. Das Dateiformat ist so ausgelegt, dass seine Struktur unabhängig vom Betriebssystem übertragbar ist.
Zur Speicherung werden die Bilder in Felder unterteilt und mit einem Schlüssel versehen (Tag). Eine TIFF-Datei ist in etwa wie ein Lochstreifenband. Wieviele Felder in einer Datei vorhanden sind, steht am Anfang einer Datei. Eine TIFF-Datei besteht aus einer dreiteiligen Struktur, die immer eingehalten werden muss. Der Anfang macht der Header (Kopf), danach folgt das «directory» und am Schluss stehen dann die Bilddaten selbst.
Die Datenstruktur von TIFF-Dateien
Der Header von TIFF-Dateien besteht aus 64 Bit, die in vier Worte unterteilt sind. Das erste 16-Bit Wort (Byte 0 und 1) definiert die Reihenfolge, welche innerhalb der Datei eingehalten wird. Zwei Formate sind möglich, das Format II (hex 4949) und das Format MM (hex 4D4D). Mit dem Format II werden die Bytes in der Reihenfolge: niederwertiges Byte vor höherwertigem Byte abgelegt. Zum Beispiel der Wert 0110hex würde bei Format II, 10 als 01 abgelegt. Auf dem PC ist dies die gebräuchlichste Form. Mit dem Format MM wird die Reihenfolge von zwei zusammengehörenden Bytes vertauscht. Hier würde der Wert 0110hex, als 01 und 10 geschrieben.
Das zweite 16-Bit Wort (Byte 2 und 3) enthält die TIFF Versionen Nummer. Bis heute hat sich die Nummer nicht verändert. Deswegen eignet sich dieses Wort, um TIFF-Dateien zu überprüfen. Immer wenn dort hex 002A steht, können sie davon ausgehen, dass sie ein TIFF vor sich haben. Das letzte Wort des Headers, ein 32-Bit Wort (Byte 4 &endash;7), enthält den Offset (in Byte) des ersten Image File Directory (IFD). Der Offset ist ein Eintrag welche auf den Anfang der Datei hinweist. TIFF-Dateien können mehrere IFD haben, das heisst allerdings, das mehrere Bilder gespeichert sind. Diese Funktion wird häufig bei Bildbibliotheken benutzt.
Das IFD-Feld setzt sich aus drei Teilen zusammen. Die ersten beiden Bytes geben die Anzahl der Felder des IFD wieder. Danach folgt eine Reihe von 12 Byte grossen Felder, und zum Schluss findet man einen 4 Byte grossen Zeiger auf das nächste IFD. Bei nur einem IFD steht der Zeiger auf 0. In Byte 0 und 1 wird der Aufbau des IFD-Feldes bestimmt, dies geschieht mit den Tagís. Byte 2 und 3 definieren den Typ des Eintrages für dieses Feld: 1 bedeutet Byte (8-Bit); 2 bedeutet ASCII (8-Bit); 3 bedeutet SHORT (16-Bit); 4 bedeutet LONG (32 Bit), 5 bedeutet RATIONAL (32 Bit). Byte 4 bis 7 enthalten die Länge oder Werte des Feldes.
Ich möchte Ihnen hier zwei beispielhafte Tags vorstellen:
Der Bildbreite Tag
Tag = 256 (100hex)
Type = short
Länge = 1
Der Eintrag bestimmt die Breite des Bildes in Pixeln.Der «Eintrag pro Pixel» Tag
Tag = 277 (115 hex)
Type = Short
Länge = x
Anzahl der Einträge pro Pixelpunkte, als Standart wird hier für eine 1 für monochrome Daten und für Farbdaten eine 3 eingetragen.
Mit solchen Tags können die Daten sehr genau beschrieben und gespeichert werden. Wir wollen uns aber noch dem Header zuwenden. Nachfolgend ein «HexDump» eines TIFF-Files, anhand dem wir unser Wissen anwenden können.
4D4D002A0000 0008000F | = Format MM= Versionsnummer 002A= Offsetadresse des ersten IFD (in Byte) = 8= Anzahl der Einträge des IFD = 15 |
00FE 0004 0000 0001 0000 0000 | = Unterdateityp (Tag 00FE) / Long / Länge = 1 / Wert = 0 |
Weiter im HexDump folgen: Bildbreite Tag, Bildlänge Tag, Bit pro Eintrag Tag usw. |
3. PostScript |
PostScript wurde 1982 von der von John Warnock und Chuck Geschke gegründeten Firma Adobe Systems Inc. entwickelt. Dank PostScript (PS), nachfolgend auch PS abgekürzt, können Bilder und Text hardwareunabhängig auf verschiedenen Ausgabeeinheiten wiedergegeben werden. Eine PostSript-Datei enthält mit jedem Texteditor lesbaren, ASCII Code. Der Code besteht aus Folgen von Anweisungen, Schleifen, Arrays, logischer Operatoren und Variablen. Auf diese Weise kann eine PostScript-Datei auch von Hand programmiert werden. Da sich PostScript bezüglich Syntax und Komplexität nicht von höheren Programmiersprachen unterscheidet, muss man für das Erlernen eine ebenso lange Zeit aufwenden. Wir wollen aber trotzdem ein paar grundlegende Funktionen betrachten.
PS ist eine stapelorientierte Sprache, in der sich die Arbeitswerte, Definitionen und Ergebnisse in geordneten Listen befinden. PostScript ist eine erweiterbare Sprache. Dies bedeutet, dass man Routinen aus Termen grundlegender PostScript-Operationen definieren kann und diese neue Term wiederum als Teil einer weiteren Definition verwenden kann.
PostScript Anweisungen werden in der sogenannten Postfix-Notation geschrieben. Dass heisst, man gibt zuerst die Objekte an, die man benutzen will und erst danach, was man mit ihnen tun will. Will man zum Beispiel 1 und 2 zusammenzählen, schreibt man:
1 2 add
und nicht
1 + 2
Durch diese Postfix-Notation ist es für PostScript möglich, aufgrund einer Reihe einfacher Regeln Objekte auszuwerten.
Im allgemeinen arbeitet sich ein PostScript Interpreter wie folgt durch den vom Computer kommenden PS-Code:
Sobald er eine Reihe von Symbolen gelesen hat, stellt er fest, wo die Unterbrechungen sind und ordnet jeder Gruppe eine logische Einheit, ein sogenanntes Kürzel zu. Wenn es sich bei dem Kürzel um eine Ziffer handelt, speichert der PS-Interpreter sie auf einen Stapel, um sie für den späteren Gebrauch verfügbar zu haben. Wenn das Kürzel ein Name ist, prüft der PS-Interpreter noch, ob es sich um eine Routine oder um eine Anweisung handelt. Ist es eine Anweisung, holt er so viele Werte vom Stapel wie die Anweisung braucht. Danach stellt der PS-Interpreter das Resultat wieder auf den Stapel zurück.
Ein bisschen Praxis
Copypage
Dieses einzeilige PS-Programm «copypage» teilt einem Drucker mit, das er die aktuelle Seite drucken soll. Da wir natürlich nichts auf der Seite haben, gibt der Drucker eine leere Seite aus. Als Höhepunkt der Papierverschwendung, wollen wir unseren Drucker zwei leere Seiten auswerfen lassen! Um das zu tun, müssen wir die Routine wie folgt abändern:
2 {copypage} repeat
Der Interpreter findet zuerst die Ziffer 2. Er stellt sie auf den Stapel, bis sie benötigt wird. Dann findet der Interpreter «{copypage}». Geschweifte Klammern teilen dem Interpreter mit, dass er den eingeklammerten Befehl speichern und nicht ausführen soll. Der Interpreter findet dann «repeat». Repeat ist ein Befehl, den er als ausführbaren Befehl versteht, und der zwei Operanden benötigt. Der Interpreter holt sich die beiden Operanden vom Stapel. Der erste ist «copypage», der zweite ist der Wiederholungsfaktor.
Nun wollen wir noch die Grundlagen der Grafik betrachten. In einer PS-Datei werden alle Elemente (Linien, Kurven, Schriften, Bilder) in einem Koordinatensystem plaziert. Das Koordinatensystem hat seinen Ursprung in der unteren linken Ecke der Seite. Die Masseinheit ist 1/72 Zoll. Um eine Linie zu zeichnen, müssen wir zuerst die Position des Anfangspunktes festlegen. Der Operand zur Positionierung von Koordinatenpunkten heisst «moveto». Mit
72 72 moveto
wird der interne Zeiger auf den Punkt x=72 und y=72 vom linken unteren Blattrand positioniert. Mit dem Operanden «lineto» wird eine imaginäre Linie gezogen. Um die Linie noch sichtbar zu machen, muss sie noch mit einem weiteren Befehl gezogen werden. Dies geschieht mit dem Befehl «stroke»
72 72 moveto
72 800 lineto
stroke
copypage
So sieht unsere Linie als PostScript-Code aus. Probieren Sie es doch einmal. Schreiben Sie den Code auf dem NotePad in Windows oder im SimpleText auf dem Macintosh. Speichern Sie das File anschliessend und laden es mittels dem Downlader von Adobe auf Ihren Drucker.
Bitmaps
PostScript kann neben grafischen Elementen auch Bilder enthalten. In PostScript können bis zu 256 Graustufen dargestellt werden. Die Folge von Bildwerten kann im Gegensatz zu andern Formaten nicht komprimiert werden. Deswegen sind PS-Files um ein vielfaches Grösser als andere Rasterformate. Ein Bitmap, also eine Rastergrafik, wird mit dem Operator «image» festgelegt. Die Syntax lautet:
Breite / Höhe / Bits pro Pixel / Matrix / Prozedur / image
Die Breite gibt die Anzahl Pixel des Bildes in der X-Achse an.
Die Höhe gibt die Anzahl Pixel des Bildes in der Y-Achse an.
Bits pro Pixel gibt Auskunft darüber, wieviele Bits ein Pixel im Rasterbild festlegen:
1 = Schwarz/Weiss
2 = 4 Graustufen
4 = 16 Graustufen
8 = 256 Graustufen
Matrix enthält einen Array mit sechs Elementen welcher die Lage des Bitmap auf der Seite festlegt.
Die Prozedur enthält die Daten des Rasterbildes in Form einer Zeichenfolge.
PostScript ist eine geräteunabhängige Programmiersprache und eignet sich ausgezeichnet um komplexe Element zu beschreiben und zu drucken. Datenaustausch ist jedoch mit diesen Printfiles nicht möglich. Deshalb hat man noch ein weiteres PostScript-Format entwickelt, welches diese Lücke schliessen soll. Und zwar ist dies das EPSF-Format.
4. EPS-Dateien |
EPSF steht für «Encapsulated Post Script File». Was etwa mit «verkapselter» PS-Datei übersetzt werden kann. Die «Kapsel» besteht aus einigen Kommentarzeilen, die dem PS-Code beigefügt werden. Mittels dieser Kommentarzeilen wird gewährleistet, dass das in der Kapsel steckende PostScript Programm zwischen verschiedenen Programmen ausgetauscht werden kann.
EPS-Dateien bestehen aus zwei Hauptabschnitten: ein Vorspann und ein Script. Dieses Script beschreibt die Elemente auf der Seite in PostScript-Sprachelementen. Zur Erstellung von EPS Quellcode lässt PS einem Freiheiten. Jede EPS-Datei muss nur Angaben über die Version der verwendeten Adobe Strukturkonvention sowie über die EPS-Fileversion besitzen. Eine weitere unerlässliche Angabe in EPS-Dateien ist die Grösse der bedruckten Fläche. Schauen wir uns deshalb die ersten Zeilen eines EPS Vorspanns im HexEditor an.
Jede EPS-Datei beginnt mit: %!PS-Adobe-3.0 EPSF-3.0. Wobei sich die Versionen auf die aktuellen Strukturkonventionen beziehen. Danach folgt das Erzeugerprogramm: In diesem Fall Adobe Illustrator V. 7.0, die Person, die das EPS erstellt hat und der Titel der Datei: «test.eps». Danach folgt die Bounding Box. Sie gibt die Ausdehnung, in 1/72 Zoll, der in der Postscript Datei enthaltenen Grafik an.
Erst mit der Einführung von EPS-Dateien wurde das Austauschen von PostScript Dateien möglich. Um den Hardware-unabhängigen Austausch von Dateien nicht zu gefährden, sollte auf keinen Fall gerätespezifisch programmiert werden. Dies könnte zwar den EPS-Code optimieren, der Code wäre aber nur auf die eigene Umgebung angepasst und würde bei einem anderen PostScript Interpreter womöglich PostScript Fehler auslösen.
Hier endet meine kleine Abhandlung über die Grundlagen von den wichtigsten Formaten der grafischen Industrie. Wenn Sie jetzt Blut geleckt haben und Sie sich mehr mit der Theorie der Datenformate auseinander setzen wollen, lege ich Ihnen ans Herz, sich zuerst im Fachbuchhandel mit Literatur einzudecken, bevor sie irgendwelche Kurse buchen. In den Fachbuchhandlungen ist sehr viel gutes Material vorhanden um sich im Selbststudium sehr weit zu bringen. Sollten Sie Fragen oder Anregungen haben, können sie mich per e-mail erreichen. Schreiben Sie an chm@pts.ch